xargsとgrepを使用してディレクトリの内容を一覧表示する

xargsとgrepを使用してディレクトリの内容を一覧表示する

特定のパターンで名前が付けられたjsonファイルとpdfファイルがたくさんあるディレクトリがあります。\d{11}-\d\.(?:json|pdf)コマンドは、次のパターンを使用して名前でファイルをフィルタリングしようとしています。何らかの理由で動作しません。これは、xargsが引数を1つの大きな文字列行として使用するか、入力が分割されたときに空白、\ n、またはnull文字があるためだと思います。

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

これを試みると、ls | xargs -d '\n' -n 1 grep '\d'数値を含むファイル名が選択され、複数の正規表現を指定すると一致するものはありません。

答え1

まず、grepがファイル名のリストではなく、リストされls | xargs grep 'pattern'たファイルの内容からエントリを検索するようにします。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

複雑さは必要ありません。ただシェルグローブを使用してください。これは、サポートの選択肢をbash理解するシェルなどのシェルで機能します。{x,y}

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}

一致するファイルで操作を実行するには、出力を取得するのではなく、lsglobを使用してファイルを直接繰り返すだけです。

関連情報