我嘗試使用以下命令中的所有文件執行命令:擊:與擴展遞歸
herbalizer file_name.haml > file_name.erb
這裏file_name.haml
是文件名,很明顯。
如何將此命令以遞歸方式應用於當前目錄中的所有haml
文件到所有子目錄?文件名應該保持不變如上所述,因此應用上abc.haml
將herbalizer abc.haml > abc.erb
到目前爲止:find . -type f -exec herbalizer {} \;
我嘗試使用以下命令中的所有文件執行命令:擊:與擴展遞歸
herbalizer file_name.haml > file_name.erb
這裏file_name.haml
是文件名,很明顯。
如何將此命令以遞歸方式應用於當前目錄中的所有haml
文件到所有子目錄?文件名應該保持不變如上所述,因此應用上abc.haml
將herbalizer abc.haml > abc.erb
到目前爲止:find . -type f -exec herbalizer {} \;
你是八九不離十。您可以使用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"' \;
您可以使用basename
,dirname
和find
得到您想要的結果:
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
您可以用'$ {fname%.haml} .erb'替換'$(dirname $ fname)/ $(basename $ fname .haml).erb'。 – Dummy00001
對不起,我用報價過分了。現在修復。 – alexis
謝謝,在應用到當前目錄時,看起來樹不再維護。 Haml文件被刪除,新文件在當前目錄中創建,而不是各自的目錄。 –
好像給出的範圍始終是當前目錄而不是文件實際所在的目錄。 –