使用 xargs 和 grep 列出目录内容

使用 xargs 和 grep 列出目录内容

我有一个目录,其中包含大量以某种模式命名的 json 和 pdf 文件。我试图\d{11}-\d\.(?:json|pdf)在命令中使用以下模式过滤名称上的文件。由于某种原因它不起作用。我相信这是由于 xargs 将参数作为一大行字符串,或者当输入被分割时存在一些空格、\n 或空字符。

ls | xargs -d '\n' -n 1 grep '\d{11}-\d\.(?:json|pdf)'

如果我尝试这样做,ls | xargs -d '\n' -n 1 grep '\d'它会选择其中包含数字的文件名,一旦我指定了多重正则表达式,就没有任何匹配项。

答案1

首先,ls | xargs grep 'pattern'使 grep 在 列出的文件内容中查找出现的内容ls,而不是在文件名列表中查找。要查找文件名,应该足以执行以下操作:

ls | grep 'pattern'

其次,grep '\d{11}-\d\.(?:json|pdf)'仅适用于 GNU grep 和 -P 选项。请使用以下语法 - 它适用于 grep 的 GNU、busybox 和 FreeBSD 实现:

ls | grep -E '[[:digit:]]{11}-[[:digit:]]\.(json|pdf)'

第三,解析 ls 不是一个好主意。使用 GNU find

find . -maxdepth 1 -regextype egrep -regex '.*/[[:digit:]]{11}-[[:digit:]]\.(json|pdf)'

或 FreeBSD 查找:

find -E . -maxdepth 1 -regex '.*/[[:digit:]]{11}-[[:digit:]]\.(json|pdf)'

答案2

您不需要任何复杂性。只需使用 shell glob 即可。这适用于诸如bash了解{x,y}支撑替代方案的 shell:

ls *[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9].{json,pdf}

如果您想对匹配的文件执行某些操作,请不要获取输出,ls而只需使用 glob 直接迭代文件。

相关内容