2016-07-29 75 views
0

我期待生成一個包含以下命令的結果的輸出文件:「爲每個」標準輸出的bash

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; done 

我曾嘗試:

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; > output.txt; done 

此生成文件,但它是空白的。我也嘗試過:

cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; done; >output.txt 

這會生成一個太大的文件。這不是我正在尋找的。 感謝您的幫助。

+2

太大?,所以你不希望這個文件中的所有文件的內容? –

+0

......我的意思是,有一些明顯缺乏引用的錯誤,但如果你在這種情況下描述了「太大」意味着什麼,它會有所幫助。 –

+0

你只想要在文件中的回聲結果或這些文件的內容+回聲結果? –

回答

3

如果你想爲命令塊代替重定向,而不影響性能和參與子shell等副作用,把它放在括號:

{ 
    cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done 
} >output.txt 

...作爲一個班輪,確保右括號之前把;

{ cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done; } >output.txt 

順便說一句,請注意它是cat "$each",而不是cat $each。如果你有一個用touch '*'創建的文件,那麼你的輸出大小就會增加一倍。


那說,這確實是非常接近相同:

cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done >output.txt 

...爲其>output.txt適用於for環路(只有循環)。不同之處在於,{ ... }方法還會重定向來自cd命令的任何標準輸出(除非使用shell函數包裝器或類似方法重新定義它,否則應該沒有這個標準輸出)。

也就是說:

# this does not redirect the header 
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done >output 

# this does not redirect the header or the loop 
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer >output 

# this redirects everything 
{ cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer; } >output 
1

此:

... echo $each"######_NEW_FILE_######"; > output.txt 
             ^--- 

您與;終止echo,使得> output.txt聲明完全獨立的回聲。

你想

... echo '...' > output.txt; etc... 
          ^---note 
0

下面done分號結束的聲明,這意味着重定向不與任何命令關聯。

失去最後的;它應該工作。

相關問題