web-dev-qa-db-ja.com

なぜこれが機能しないのですか? "ls * .txt | xargs cat> all.txt"(すべてのファイルを単一のtxtドキュメントに)

なぜこれが機能しないのですか?

ls *.txt | xargs cat > all.txt

(すべてのテキストファイルの内容を1つの「all.txt」ファイルに結合したいと思います。)-execを使用した検索も機能するはずですが、xargs構文を本当に理解したいと思います。

ありがとう

20
ajo

ls *.txt | xargs cat >> all.txt

各ファイルの後に再度作成するのではなく、all.txtに追加するため、少しうまくいくかもしれません。

ところで、 cat *.txt >all.txtも機能します。 :-)

27

一部のファイル名に「、」が含まれている場合、またはスペース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 の詳細

3
Ole Tange

all.txtは同じディレクトリ内のファイルであるため、同じファイルから同じファイルに書きたい場合、catは混乱します。

一方:

ls *.txt | xargs cat > tmp/all.txt

これは、現在のディレクトリのテキストファイルからサブディレクトリのall.txtに読み込みます(*.txtには含まれていません)。

1
Jeremy Smyth

コマンドラインの長さの制限に遭遇することもあります。 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オプションは、同じ形式の入力を期待するように指示します。これは、改行を含むファイル名がある場合でも機能します。

0
Brian Minton