2015-01-08 114 views
0

我期待結合輸出的Linux查找和頭命令(來派生一個文件名列表)與另一個Linux/bash命令的輸出並保存結果一個文件使得來自「查找」的每個文件名與另一行中的另一個命令輸出一起發生。合併找到命令輸出與另一個命令輸出並重定向到文件

因此,例如, - 如果目錄TESTDIR包含文件A.TXT,b.txt和c.txt, - 和其他命令的輸出是一定數目的說如圖10所示,所需的輸出I」找的是

10 a.txt 
10 b.txt 
10 c.txt 

在搜索在這裏,我看到鄉親推薦膏做類似的合併,但我無法弄清楚如何糊似乎在期待文件做,在這種情況下。我試過

paste $(find testdir -maxdepth 1 -type f -name "*.text" | head -2) $(echo "10") > output.txt 
paste: 10: No such file or directory 

希望我做錯的任何指針。任何其他方式實現同​​樣的事情也是受歡迎的。

請注意,如果我想讓所有內容都顯示在同一行上,我可以使用xargs並執行該任務。

$find testdir -maxdepth 1 -type f -name "*.text" | head -2 |xargs echo "10" > output.txt 

$cat output.txt 
10 a.txt b.txt 

但我的要求是合併兩個命令輸出,如前所示。

在此先感謝您的幫助!

+1

'$(...)'是「命令替換」,它取代了命令與輸出的字符串。 '<(...)'是「Procession Substituion」,並用類似文件的對象替換該命令。所以你會希望在你的粘貼命令中使用<(...)。這表示粘貼需要來自兩個來源的多行代碼,而您的命令沒有這些代碼。 –

回答

0

find可以同時處理-exec-print指令,你只需要合併輸出:

$ find . -maxdepth 1 -type f -name \*.txt -exec echo hello \; -print | paste - - 
hello ./b.txt 
hello ./a.txt 
hello ./all.txt 

假設你的 「命令」 要求的文件名(這裏有一個非常人爲的例子):

$ find . -maxdepth 1 -type f -name \*.txt -exec sh -c 'wc -l <"$1"' _ {} \; -print | paste - - 
4 ./b.txt 
4 ./a.txt 
7 ./all.txt 

當然,這是執行每個文件的命令。使用-L1

cmd_out=$(echo 10) 
for file in *.txt; do 
    echo "$cmd_out $file" 
done 
+0

謝謝,這將對我有用! – mailforbiz

0

試試這個,

$find testdir -maxdepth 1 -type f -name "*.text" | head -2 |tr ' ' '\n'|sed -i 's/^/10/' > output.txt 
+0

感謝您的指針。這個命令給出錯誤「sed:no input files」。有一些衝突或某些東西是不能逃脫的權利。 – mailforbiz

+0

似乎它的-i標誌不能正常工作 - 如果我將命令的輸出保存到文件中,然後在文件上執行sed,它就會起作用。所以需要弄清楚如何讓sed -i正常工作。 – mailforbiz

+1

在某些平臺上,您必須提供一個備份後綴作爲-i參數(即'sed -i.bak ...') –

0

您可以xargs在同一時間在同一行操作:要限制自己,你的問題

find testdir -maxdepth 1 -type f -name "*.text" | xargs -L1 echo "10" > output.txt 
+0

是的,這也適用,並且比看起來似乎更快。謝謝! – mailforbiz

相關問題