Shell
連接數千個文件:> vs >>
對於以下問題,我在 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
.