xargs出力に改行文字があるのはなぜですか?

xargs出力に改行文字があるのはなぜですか?

コマンドを実行すると、find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt次の結果が返されます。

./testfile.txt
./testread.txt

対照的に、コマンドfind . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0出力./testfile.txt./testread.txtは1行であり、私が理解したように、フラグは-print0/ replacesを\n削除するか、NUL区切り\0文字として使用します。

xargs後続のコマンドとパラメータが次のように渡されるとfind . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0 -i echo {}表示されます。

./testfile.txt
./testread.txt

'{}'フラグが使用され、スペースなどの文字がエラーなしで処理されるため、後続のステップは必要ないと仮定します。echo-print0

次のコマンドはすべて単一行を生成します。

  • find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0
  • find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0 echo

xargswithが{}返した結果に改行文字が含まれているのはなぜですか?

改行文字が追加されると、{}なぜコマンドと一緒に使用されますかecho {}

ベストアンサー1

GNUの場合、xargsこの-iオプション(廃止予定)はと同じです-I {}。これは、「ユーティリティに表示される文字列を{}標準入力の項目に置き換え、ユーティリティを実行して標準入力の次の項目に繰り返す」という意味です。

ユーティリティ呼び出しはで、echo {}2つを渡します。これは、標準入力から項目の1つを読むたびに2回xargs呼び出すことを意味します。echo各呼び出しは末尾の改行文字を出力しますecho(これはの機能ですecho)。

echo {}および が-iない場合は、標準xargs入力からできるだけ多くの項目を収集し、echo同時にすべて呼び出したかのように出力します。

つまり、xargs改行を追加する代わりにecho改行を追加します。何度も呼び出すのでこうなります。

はい(何をしているかを示す-tために追加されました):xargs

$ printf 'file1\nfile2\n' | xargs -t -I {} echo {}
echo file1
file1
echo file2
file2
$ printf 'file1\nfile2\n' | xargs -t echo
echo file1 file2
file1 file2

おすすめ記事