我有一个目录,其中g_inboundDir
包含以下文件:
XAI-001-20170709-123456791.pdf YXAI-001-20170709-123456791.pdf 001-20170744-123456791.pdf
Variable g_filPfix="XAI" Variable g_fileExt=".pdf"
现在我想选择以 XAI 开头的每个文件并对其进行处理,为此我编写了以下命令:
for i in `ls ${g_inboundDir}/* | grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$' 2>/dev/null`
我希望只收到 XAI-001-20170709-123456791.pdf 文件,但我没有收到任何文件。
答案1
不解析ls
。
for file in "${g_inboundDir}"/XAI*.pdf; do
things_to "$file"
done
答案2
grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$'
这里直接的问题是 for 的模式grep
用单引号括起来,因此 shell 不会扩展变量g_filPfix
和g_fileExt
。用双引号替换引号可以解决这个问题。 (并且您不需要模式中的括号。)
ls
对于包含空格或一些奇怪字符的文件名,解析类似的输出可能会出现问题。特别是,中间有空格的文件名将被视为两个文件名。
如果您实际上不需要如此严格的模式,您可以只处理具有给定前缀和后缀的所有文件:
for f in "$dir/$prefix"*"$suffix" ; do
somecmd "$f"
done
如果您确实需要严格的模式,某些 shell(例如 Linux 上可能有的 Bash)可以在没有外部工具的情况下进行正则表达式匹配。因此,要循环目录中的所有文件并忽略与模式不匹配的文件:
for f in "$dir"/* ; do
[[ "$f" =~ "/$prefix"-[0-9]{3}-[0-9]{8}-[0-9]{9}"$suffix"$ ]] || continue
somecmd "$f"
done
答案3
不要 grep ls。使用 find 和 regexp 代替:
find ${g_inboundDir} -regextype sed -regex "^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$"
最后,您可以使用 -exec 对这些文件执行某些操作。
查看人发现了解有关查找的更多信息:)