なぜこれが機能しないのですか?
ls *.txt | xargs cat > all.txt
(すべてのテキストファイルの内容を1つの「all.txt」ファイルに結合したいと思います。)-execを使用した検索も機能するはずですが、xargs構文を本当に理解したいと思います。
ありがとう
ls *.txt | xargs cat >> all.txt
各ファイルの後に再度作成するのではなく、all.txtに追加するため、少しうまくいくかもしれません。
ところで、 cat *.txt >all.txt
も機能します。 :-)
一部のファイル名に「、」が含まれている場合、またはスペースxargs
は、 セパレータの問題 のために失敗します
一般に、xargs
は-0なしで実行しないでください。いつか戻ってきて、あなたに噛み付くからです。
代わりにGNU Parallelの使用を検討してください:
ls *.txt | parallel cat > tmp/all.txt
またはご希望の場合:
ls *.txt | parallel cat >> tmp/all.txt
GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ の詳細
all.txt
は同じディレクトリ内のファイルであるため、同じファイルから同じファイルに書きたい場合、catは混乱します。
一方:
ls *.txt | xargs cat > tmp/all.txt
これは、現在のディレクトリのテキストファイルからサブディレクトリのall.txtに読み込みます(*.txt
には含まれていません)。
コマンドラインの長さの制限に遭遇することもあります。 xargs
を使用する理由の一部は、入力を安全なコマンドラインサイズのチャンクに分割することです。したがって、ディレクトリに何十万もの.txtファイルがある状況を想像してみてください。 ls *.txt
は失敗します。あなたがする必要があります
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
この場合の.txt$
は、.txtで終わるすべてに一致する正規表現です(つまり、*.txt
とは正確に異なります。atxt
というファイルがある場合、*.txt
は一致しませんが、正規表現は一致します。)
別のパスの使用は、他の回答が指摘したように、all.txtがパターン*.txt
と一致するため、入力と出力の間に競合が生じるためです。
名前に'
が含まれているファイルがある場合(これがunmatched single quote
エラーの原因である可能性があります)、次のようにしてください。
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
--nullオプションは、デフォルトの改行の代わりに\0
(別名null)文字で区切られた出力を使用するようにgrepに指示し、 `xargsの-0
オプションは、同じ形式の入力を期待するように指示します。これは、改行を含むファイル名がある場合でも機能します。