2011-10-18 66 views
3

使用以下我將文件名添加到每行的前面並將輸出發送到單個文件。使用find和sed將文件名添加到文件的開頭

ls | while read file; do sed -e "s/^/$file/g" $file > out; done 

我想執行同一sed更換,但使用findexecxargs命令 -

find . -type f -exec sed "s/^/{}/g" {} > out + 

,但我得到一個錯誤 -

發現:只有一個實例{}支持-exec ... +

輸入文件是這樣的 -

fileA.txt

A1 
A2 

fileB.txt

B1 
B2 

所需的輸出

fileA.txt A1 
fileA.txt A2 
fileB.txt B1 
fileB.txt B2 

我知道如何使用awk做到這一點,但我想用sed,find和e來做xec或xargs。

回答

3
find . -type f |xargs awk '$0=FILENAME$0' > out 

當我回答這個問題時,你的「不awk」行還沒有。反正,看看下面我更新的答案:

更新基於評論

所以要使用發現,EXEC/xargs的,和sed做。我的腳本需要GNU Sed,我希望你有它。

首先看到一個班輪:(......嗯,> out省略你可以將它添加到該行的結束)

find . -type f | xargs -i echo {}|sed -r 's#(.\/)(.*)#cat &\|sed "s:^:file \2 :g"#ge' 

現在讓我們來測試,見下圖:

kent$ head *.txt 
==> a.txt <== 
A1 
A2 

==> b.txt <== 
B1 
B2 

kent$ find . -type f | xargs -i echo {}|sed -r 's#(.\/)(.*)#cat &\|sed "s:^:file \2 :g"#ge' 
file b.txt B1 
file b.txt B2 
file a.txt A1 
file a.txt A2 

是你期望的結果嗎?

簡短說明

  • find ....|xargs -i echo {}沒什麼好解釋的,只是打印每行的 文件名(與領先"./"
  • ,則文件名傳遞給sed的線像sed -r 's#(.\/)(.*)# MAGIC #ge'
  • 記住,在上面一行,我們有兩組\1: "./"\2 "a.txt"(filename)
  • ,因爲我們在SED線的末端具有e,所述MAGIC部分將是 用作外殼命令的執行(GNU Sed則需要)
  • MAGICcat &\|sed "s:^:file \2 :g貓&只是輸出的文件 內容,和管到另一個sed。做替換(s:..:..:g
  • 最後,MAGIC的執行結果將是替換 外部sed。

關鍵是Gnu sed的'e'。

+0

正如我在這個問題中所說的,我知道如何用awk來做到這一點,但我想用sed來找到它。 – Bryan

+0

看到我更新的答案,find,xargs和sed。 – Kent

+0

謝謝,如果你有時間和興趣,你能否添加一些解釋性評論? – Bryan

4

未經測試,請嘗試使用xargs的

find . -type f | xargs -I FILE sed "s/^/FILE/g" FILE > out 
+1

將'/'更改爲'|'爲我工作。 '發現。 -type f | xargs -I FILE sed「s |^| FILE | g」FILE> out' – rickfoosusa

0

如何:

find . -type f | xargs -i echo FILE/{} > out 
+1

uhm這個還能做別的.. –

+0

你可以修改你的問題來顯示你想要什麼類型的輸出的例子嗎?目前我寫的不太明白。 –

+0

更新了問題 – Bryan

1

你爲什麼不乾脆更換ls在與find這樣的第一線?

find . -type f | while read file; do sed -e "s|^|$file|" $file > out; done 

您只能從/換取s分隔符別的東西不包含在你的文件名。我選擇了|爲例。

+0

從我可以看到發現與-exec是更快,我有成千上萬的文件。 – Bryan

+0

@Bryan:迄今尚未提及表演。因爲'find -exec'和'while'循環都會爲每個文件創建一個新的'sed'進程,所以你既不會獲得也不會丟失任何東西。此外:我預計,大部分時間將花費在閱讀和編寫文件的_contents_上。 –

+0

僅供參考少量文件 - 時間查找。 -type f -exec sed「s/^/replacement/g」{} +需要真正的0m0.736s,但時間查找。 -type f |同時讀取文件;做sed -e「s |^|替換|」 $ file;完成需要真正的0m3.165s。並使用xargs而不是exec更快一點 – Bryan

相關問題