ls命令的过滤结果,仅根据格式获取某些文件名

AlluSingh

我有一个目录,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_filPfixand 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章