StackOverflow では、次の質問について一見矛盾する 2 つの答えを見つけました。
最初の質問に対する最良の答えは次のとおりです。
find . -name *.txt -print0 | xargs -0 cat >> out.txt
2番目の質問に対する最良の答えは次のとおりです。
find . -name *.txt -print0 | xargs -0 cat > out.txt
私が知っている限り、最初のものは>>
(追加)演算子を使用しているため正確ですが、2番目のものは出力をファイルに>
リダイレクトする演算子を使用するため正確ではありません。しかし、2番目の答えはより多くの表(10)を得て、コメントなしで承認されます。どちらも正解ですか?なぜ?それでは、これら2つの演算子を持つ目的は何ですか?
答え1
2番目の例:
find . -name '*.txt' -print0 | xargs -0 cat > out.txt
完全に正当なout.txt
ファイルが実行されるたびに再生成され、最初のファイルのout.txt
実行がリンクされます。しかし、両方のコマンドは本質的に同じことを行います。
この質問は混乱していますxargs -0 cat
。人々はリダイレクトがコマンドout.txt
の一部だと思いますが、そうではありません。リダイレクトはxargs -o cat
STDINを介して入力を受け取り、その出力を単一のストリームとしてSTDOUTに出力した後に発生します。これはxargs
、出力ではなく最適化されたファイルのディレクトリです。
ここに私が言う内容の例があります。pv -l
とファイル出力の間に1つを挿入すると、catが何行を書いたかがわかります。xargs -0 cat
out.txt
はい
これを示すために、10,000個のファイルを含むディレクトリを作成しました。
for i in `seq -w 1 10000`;do echo "contents of file$i.txt" > file$i.txt;done
各ファイルは次のようになります。
$ more file00001.txt
contents of file00001.txt
出力pv
:
$ find . -name '*.txt' -print0 | xargs -0 cat | pv -l > singlefile.rpt
10k 0:00:00 [31.1k/s] [ <=>
singlefile.rpt
ご覧のとおり、私のファイルには10,000行が記録されています。出力ブロックが渡されると、減少するxargs
行数が表示されることがわかりますpv
。
答え2
それでは、これら2つの演算子を持つ目的は何ですか?
簡単です。いろいろなユースケースがあるからです。場合によっては、ターゲットファイルを最初にサイズ0に切り捨てることが役に立つことがあり、時には(ログファイルなど)データをファイルに追加する方が合理的です。
この場合、追加することは意味がありません。 「開始部分にデータがあり、最後に選択したファイルの内容を含むファイル」ではなく、選択したファイルとまったく同じ内容を持つファイルが必要です。
答え3
私は2番目を選択します。 Enterキーを押すとstdoutのリダイレクトがbashによってキャプチャされるため、find / xargsの各行に対して新しいリダイレクトを作成するのとは異なります(おそらく彼らのアイデアだったでしょう)。そうout.txt
でなければ同じでなければなりません。すでにデータがある場合、2番目のデータは少なくともファイルを既知のコンテンツ(つまりコンテンツなし)にリセットします。