Grep

使用 xargs 和 grep 列出目錄內容

  • August 28, 2021

我有一個目錄,其中包含大量以某種模式命名的 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'它會選擇其中包含數字的文件名,只要我指定多重正則表達式,就沒有任何匹配項。

首先,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)'

引用自:https://unix.stackexchange.com/questions/666657