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'
它會選擇其中包含數字的文件名,只要我指定多重正則表達式,就沒有任何匹配項。
首先,
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)'