私はシェルスクリプトを持っています
find . -name "*.java" -print0 | xargs -0 grep -Lz 'regular_expression'
この方法で正規表現に一致しないファイル名を出力します。
file1.java
file2.java
...
私が理解している方法では、次のように機能します。find必要なファイルを見つけて、それらの名前を\0. 次にwithxargsの出力を分割し、それらを1 つずつフィードします。find\0grep
basename次に、ステージをもう 1 つ追加して、ファイルのみを取得したいと考えました。スクリプトを変更しました:
find . -name "*.java" -print0 | xargs -0 grep -LzZ 'regular_expression' | xargs -0 basename
しかし、エラーが発生しました。調査を開始し、一時的な出力を作成しました。
find . -name "*.java" -print0 | xargs -0 grep -LzZ 'regular_expression' | xargs -0 echo basename
そしてこれを得ました:
basename ./file1.java ./file2.java ./subdir/file1.java ./subdir/file2.java
そのため、ファイル名は\0. xargswith で使用され、 withでgrep分割されていない場合に、なぜそれらが分割されるのかわかりません。xargsbasename
-n1後者で使用して回避策を得ましたxargs。xargsしかし、なぜそれが必要なのか ( withで in を使用しなかった場合grep) と、このパラメーターが何をするのかはまだわかりません。
-n1後者の使用法では何が必要で、前者の使用法では必要なかった理由を説明していただければ幸いですgrep。