何千ものファイルを関連付ける: > vs >>

何千ものファイルを関連付ける: > vs >>

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 catSTDINを介して入力を受け取り、その出力を単一のストリームとしてSTDOUTに出力した後に発生します。これはxargs、出力ではなく最適化されたファイルのディレクトリです。

ここに私が言う内容の例があります。pv -lとファイル出力の間に1つを挿入すると、catが何行を書いたかがわかります。xargs -0 catout.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

おすすめ記事