2012-11-26 90 views
3

我試圖操縱從find命令的文件名:終端find命令:操縱輸出字符串

find . -name "*.xib" -exec echo '{}' ';' 

例如,這可能會打印:

./Views/Help/VCHelp。廈門國際銀行

我想使它:

./Views/Help/VCHelp.strings

我試了一下:

find . -name "*.xib" -exec echo ${'{}'%.*} ';' 

但 '{}' 不能被識別爲一個字符串或東西...


我也試過如下:

find . -name "*.xib" -exec filename='{}' ";" -exec echo ${filename%.*} ";" 

但它是試圖執行一個名爲「文件名」,而不是分配變量命令:

發現:文件名:沒有這樣的文件或目錄

+1

我編輯了答案,解釋了爲什麼你不能簡單地使用'-exec filename ='{}'「;」',請確保你閱讀了它。 – livibetter

回答

5

不能使用參數擴展與字面串。嘗試將它先存儲在一個變量:

find . -name '*.xib' -exec bash -c "f='{}' ; echo \${f%.xib}.strings" \; 

-exec看到的第一個參數之後的命令,因此不能簡單地把它filename='{}'因爲find不使用sh執行你給出什麼。如果你想運行一些shell的東西,你需要使用shbash來包裝。

或者使用sed

find . -name '*.xib' | sed 's/.xlib$/.strings/' 
+0

完美,我想明白爲什麼我的試驗失敗了。謝謝。 – Mazyod

+0

當然,如果一個文件名包含單引號,你的第一個方法就會失敗。 –

+0

另外,嘗試'觸摸$'lol.xib \ nnotfunny.xib',看看會發生什麼......這兩種方法都失敗了。我希望這不會用在生產腳本中。 –

1
find . -name "*.xib" | sed -e 's/\.xib$/.strings/' 
2

對於這樣一個簡單的搜索,你可以使用純bash的解決方案:

#!/bin/bash 

shopt -s globstar 
shopt -s nullglob 

found=(**.xib) 

for f in "${found[@]}"; do 
    echo "${f%xib}strings" 
done 

開啓globstar外殼選項上使**爲「匹配所有文件和零個或多個目錄和子目錄「(引自bash參考手冊)。如果沒有匹配,nullglob選項會有所幫助:在這種情況下,glob將展開爲空,而不是醜陋的**.xib。該解決方案對於包含有趣角色的文件名是安全的。