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


20

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

ls *.txt | xargs cat > all.txt

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

ありがとう


1
けれどもは使用しませんls。このため。本当に使用できない場合はcat *.txt >all.txt、を試しprintf '%s\0' *.txt | xargs -r0 cat >allmv all all.txtから、ファイルが自分自身を参照しないようにしてください。
トリプリー

回答:


27

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

各ファイルの後に再度作成するのではなく、all.txtに追加するため、少しうまく機能する可能性があります。

ちなみに、cat *.txt >all.txtまた動作します。:-)


6
cat * .txt> all.txtの方が当然優れています。おかげで
アホ

1
ただし、... | xargs cat >> all.txtまたは> all.txtは常にxargsでエラーを返します:一致しない単一引用符... xargsがコマンドとしてその後すべてを取得するためですか?
アジョ

1
スペースを含むファイル名はありますか?代わりに|もしそうなら、 "xargsの-0猫>> all.txt '* .txtの' -print0見つける/あなた/パス-iname"のようなものを使用
ヤンネPikkarainen

1
いいえ、すべてのファイル名スペースをに置き換えました。しかし、考えてみると、一部のファイル名には、listing_O'Connor .txtのように単一引用符が含まれている可能性があります。これが問題になる可能性があります。
アジョ

はい、それが問題です。:)最も簡単で最も簡単な方法は、findを-print0と組み合わせてxargs -0と組み合わせて使用​​することです。この場合、チェーン全体がセパレータとしてNULL文字を使用し、空白と特殊文字が自動的に処理されます。
ジャンヌピッカライネン

3

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


1

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

一方:

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

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


それでも次のエラー:xargs:unmatched single quote; あなたは-0オプションを使用しない限り、デフォルトの引用符でxargsのに特別な
アホ

1
名前に単一引用符が含まれる.txtファイルはありますか?
ジェレミースミス

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.