2012-10-18 52 views
21

許多消息來源說的{}每個實例將通過查找發現的文件名來代替,但是當我嘗試運行下面,我只能得到一個文本文件,它的名字叫「.TXT」在「find -exec」中多次使用當前文件名(「{}」)?

find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \; 

目標是創建一個文本文件,其中每個文件只有第八列,並且每個文本文件將按照其父文件命名。關於第二組{{}的某些內容不會替換每個找到的文件的文件名。

回答

22

嘗試:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 {} > {}.txt' \; 

但要注意的一些版本找到需要{}是一個截然不同的說法,而不會擴大{}到一個文件名,否則。您可以解決與:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 $0 > $0.txt' {} \; 

(此備用命令將把輸出文件,其中包含匹配文件子目錄如果需要,您可避免通過重定向到${0#*/}

的問題是該find沒有做重定向,外殼是你的命令完全等價:

# Sample of INCORRECT code 
find /directory -name "*pattern*" -exec cut -f8 {} \; > {}.txt 

注意從標準如下:

如果存在多個只包含兩個字符「{}」的參數,則該行爲未指定。

如果utility_name或參數字符串包含兩個字符「{}」,但不僅包含兩個字符「{}」,則實現定義find是否替換這兩個字符或不改變地使用該字符串。

+0

我明白了,您的修復方法確實有效。謝謝! 我在想,是不是被誤解了 – user1757862

10

爲了應對威廉Pursell在他的回答中提到的注意事項,使用以下命令:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \; 

當您使用sh -c,它從參數的位置參數來執行後面的字符串。額外的x填充$0,替換後的文件名將變爲$1

雙引號允許此功能正確使用包含空格和其他特殊字符的文件名。

+0

+1:不錯的技巧 –

+0

任何不使用$ 0的理由:'sh -c'... $ 0 ...'{}'? –

+0

大部分它只是感覺「錯誤」 - $ 0應該是shell的名稱,而不是參數。我不知道它在那裏的便攜性。 – Barmar

1
find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}' 
相關問題