2011-07-13 46 views
4

我試圖在find命令發現的所有文件上運行expand shell命令。我試過了--exec和xargs但都失敗了。任何人都能解釋我爲什麼?我在備案的Mac上。運行展開查找結果


find . -name "*.php" -exec expand -t 4 {} > {} \;

這只是創建一個文件{}與所有的輸出,而不是覆蓋每一個人找到文件本身。


find . -name "*.php" -print0 | xargs -0 -I expand -t 4 {} > {}

而這只是輸出

4 {} 
xargs: 4: No such file or directory 

回答

8

您的命令不會,原因有二。

  1. 輸出重定向由shell完成,而不是由find完成。這意味着shell會將find的輸出重定向到文件{}
  2. 重定向將立即發生。這意味着該文件在被expand命令讀取之前將被寫入。所以將命令的輸出重定向到輸入文件是不可能的。

不幸的是expand不允許將其輸出寫入文件。所以你必須使用輸出重定向。如果使用bash,則可以定義執行expandfunction,將輸出重定向到臨時文件並將臨時文件移回原始文件。問題是find將運行一個新的shell來執行expand命令。

但是有一個解決方案:

expand_func() { 
    expand -t 4 "$1" > "$1.tmp" 
    mv "$1.tmp" "$1" 
} 

export -f expand_func 

find . -name \*.php -exec bash -c 'expand_func {}' \; 

您正在使用export -f導出功能expand_func子殼。並且您不使用find -exec執行expand本身,而是執行新的bash執行導出的expand_func

0

'擴大'並不是真的值得麻煩。 您可以使用sed代替:

find . -name "*.php" | xargs sed -i -e 's/\t/ /g'