私はシェルスクリプトを持っています
find . -name "*.java" -print0 | xargs -0 grep -Lz 'regular_expression'
この方法で正規表現に一致しないファイル名を出力します。
file1.java
file2.java
...
私が理解している方法では、次のように機能します。find
必要なファイルを見つけて、それらの名前を\0
. 次にwithxargs
の出力を分割し、それらを1 つずつフィードします。find
\0
grep
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
. xargs
with で使用され、 withでgrep
分割されていない場合に、なぜそれらが分割されるのかわかりません。xargs
basename
-n1
後者で使用して回避策を得ましたxargs
。xargs
しかし、なぜそれが必要なのか ( withで in を使用しなかった場合grep
) と、このパラメーターが何をするのかはまだわかりません。
-n1
後者の使用法では何が必要で、前者の使用法では必要なかった理由を説明していただければ幸いですgrep
。