我有一个目录,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文件,但没有任何文件。
grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$'
这里的直接问题是for的模式grep
用单引号引起来,因此外壳程序将不会扩展变量g_filPfix
and g_fileExt
。用双引号替换引号将解决此问题。(并且您不需要在模式中加上括号。)
ls
对于具有空格或一些奇数字符的文件名,解析like这样的输出可能会出现问题。特别是,中间带有空格的文件名将被视为两个文件名。
如果您实际上不需要这种严格的模式,则可以只处理具有给定前缀和后缀的所有文件:
for f in "$dir/$prefix"*"$suffix" ; do
somecmd "$f"
done
如果确实需要严格的模式,则某些外壳程序(例如Bash,您可能在Linux上具有此功能)可以在不使用外部工具的情况下进行正则表达式匹配。因此,要遍历目录中的所有文件并忽略与模式不匹配的文件:
for f in "$dir"/* ; do
[[ "$f" =~ "/$prefix"-[0-9]{3}-[0-9]{8}-[0-9]{9}"$suffix"$ ]] || continue
somecmd "$f"
done
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句