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

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

我有一个目录,其中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_filPfixg_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 对这些文件执行某些操作。
查看人发现了解有关查找的更多信息:)

相关内容