我有一个目录,其中包含大量以某种模式命名的 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 直接迭代文件。