2016-07-20 134 views
0

我嘗試使用以下命令中的所有文件執行命令:擊:與擴展遞歸

herbalizer file_name.haml > file_name.erb 

這裏file_name.haml是文件名,很明顯。

如何將此命令以遞歸方式應用於當前目錄中的所有haml文件到所有子目錄?文件名應該保持不變如上所述,因此應用上abc.hamlherbalizer abc.haml > abc.erb

到目前爲止:find . -type f -exec herbalizer {} \;

回答

2

你是八九不離十。您可以使用basename剝奪每個文件名的擴展你會發現:

find . -type f -name \*.haml -exec sh -c 'herbalizer "{}" > "$(dirname {})/$(basename {} .haml).erb"' \; 

我包裹在一個shell命令行的I/O重定向。如果文件名或路徑組件包含空格,文件名將用引號引起來。

PS。這讓你完成了這項工作,但這不是很優雅;所以這裏是一個使用bash的內置替代的替代:

find . -type f -name \*.haml -exec bash -c 'FN="{}"; herbalizer "{}" > "${FN%.haml}.erb"' \; 
+0

對不起,我用報價過分了。現在修復。 – alexis

+2

謝謝,在應用到當前目錄時,看起來樹不再維護。 Haml文件被刪除,新文件在當前目錄中創建,而不是各自的目錄。 –

+0

好像給出的範圍始終是當前目錄而不是文件實際所在的目錄。 –

3

您可以使用basenamedirnamefind得到您想要的結果:

find . -type f -name "*.haml" | while read fname 
> do 
> herbalizer ${fname} > $(dirname $fname)/$(basename $fname .haml).erb 
> done 

通過在評論部分提出另一種簡單的方法@ Dummy00001是:

find . -type f -name "*.haml" | while read fname 
> do 
> herbalizer ${fname} > ${fname%.haml}.erb 
> done 

另外參考:Parameter substitution

+2

您可以用'$ {fname%.haml} .erb'替換'$(dirname $ fname)/ $(basename $ fname .haml).erb'。 – Dummy00001