回答:
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
コマンドラインの長さの制限に遭遇する可能性もあります。使用する理由の一部は、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オプションは、grepに\0
デフォルトの改行の代わりに(別名null)文字で区切られた出力を使用するよう指示し、-0
`xargs のオプションは、同じ形式の入力を期待するように指示します。ファイル名に改行が含まれている場合でも、これは機能します。
ls
。このため。本当に使用できない場合はcat *.txt >all.txt
、を試しprintf '%s\0' *.txt | xargs -r0 cat >all
てmv all all.txt
から、ファイルが自分自身を参照しないようにしてください。