使用 xargs 和 grep 列出目录内容

Cod*_*eed 2 ls grep xargs

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

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

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

Ark*_*zyk 6

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

ls | grep 'pattern'
Run Code Online (Sandbox Code Playgroud)

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

ls | grep -E '[[:digit:]]{11}-[[:digit:]]\.(json|pdf)'
Run Code Online (Sandbox Code Playgroud)

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

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

或 FreeBSD 找到:

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