コマンドを実行すると、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
xargs
withが{}
返した結果に改行文字が含まれているのはなぜですか?
改行文字が追加されると、{}
なぜコマンドと一緒に使用されますか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