Shell

連接數千個文件:> vs >>

  • March 9, 2014

對於以下問題,我在 StackOverflow 上發現了兩個看似矛盾的答案:

第一個問題的最佳答案表明:

find . -name *.txt -print0 | xargs -0 cat >> out.txt

而第二個問題的最佳答案表明:

find . -name *.txt -print0 | xargs -0 cat > out.txt

據我所知,第一個是正確的,因為它使用了>>(append) 運算符,但不是第二個,因為它使用了>我認為只是將輸出重定向到文件的運算符。然而,第二個答案有更多的投票(10),也被接受,沒有評論。兩個答案都正確嗎?為什麼?那麼擁有這兩個運營商的目的是什麼?

第二個例子:

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之間插入一個,我們可以看到 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文件中寫入了 10k 行。如果xargs向我們傳遞大量輸出,那麼我們會通過減少呈現給pv.

引用自:https://unix.stackexchange.com/questions/76418