Linux Shell脚本如何获取匹配含空格模式的文件列表?
Shell脚本处理含空格的文件名匹配
问题场景
在Linux Shell脚本中,需根据环境变量PATTERN中存储的可能含空格的模式,获取目录中匹配该前缀的文件列表。常规的grep未正确处理空格、或find -name未加引号的写法会导致匹配失败。
示例文件列表:
file_without_spaces.vol-1.txt
file_without_spaces.vol-2.txt
file with spaces.vol-1.txt
file with spaces.vol-2.txt
file with spaces.vol-3.txt
当PATTERN="file_without_spaces"时,需输出:
file_without_spaces.vol-1.txt
file_without_spaces.vol-2.txt
当PATTERN="file with spaces"时,需输出:
file with spaces.vol-1.txt
file with spaces.vol-2.txt
file with spaces.vol-3.txt
解决方案
方法1:正确引用变量的find -name
find的-name参数支持shell通配符,只要确保PATTERN被双引号包裹,就能保留空格不被拆分:
# 仅查找当前目录下的文件,匹配以PATTERN开头的文件名 find . -maxdepth 1 -type f -name "$PATTERN*"
-maxdepth 1限制仅查找当前目录(如需递归可去掉)-type f仅匹配文件(排除目录)"$PATTERN*"确保空格被保留,*匹配前缀后的任意字符
方法2:printf+grep固定字符串匹配
利用printf正确输出含空格的文件名(每行一个),再用grep -F做固定字符串前缀匹配,避免正则元字符干扰:
# 输出当前目录所有文件名,匹配以PATTERN开头且紧跟点号的行 printf "%s\n" * | grep -F "^$PATTERN."
printf "%s\n" *会将每个文件名(含空格)单独输出一行,避免空格拆分问题-F表示按字面匹配字符串,若PATTERN包含.、*等字符,不会被解析为正则元字符^$PATTERN.匹配以PATTERN开头且紧跟点号的文件名(符合示例中的后缀格式)
方法3:find正则匹配
若需更灵活的匹配规则,可使用find的-regex参数,同样注意变量引用:
# 用正则匹配路径,确保PATTERN被正确展开 find . -maxdepth 1 -type f -regex ".*/$PATTERN\..*"
.*/匹配文件的路径前缀(当前目录下为./)$PATTERN\..*匹配PATTERN后紧跟点号和任意字符的文件名
内容的提问来源于stack exchange,提问作者Jim Stunned
相关产品推荐
相关产品推荐

