2013-10-16 49 views
1

這是我第一次使用Linux shell腳本,它看起來非常強大,但我仍然有點困惑。循環遍歷所有具有特定擴展名的文件並執行它們

我經歷了所有具有特定擴展名的目錄遞歸文件(所有子目錄,subsubdirectories和......),並通過在其上運行的可執行文件生成具有相同名稱但不同的擴展上一個新的文件要循環原始文件的確切位置。

以下是僞代碼吧:

files = list of all files (full path not just names) with extension .ext recursively 

for file in files 
    executable -option1 -option2 fullpath/file.ext1 > fullpath/file.ext2 

回答

6
find . -name '*.ext1' -type f -exec sh -c \ 
    'executable -option1 -option2 ${0} > ${0%.ext1}.ext2' {} \; 

find是遞歸遍歷文件樹的標準工具。第一個參數(在本例中是'。',意思是當前工作目錄)指定了開始下降的樹的底部。 -name參數將搜索範圍限制爲與給定文件名匹配的文件。 -type f進一步限制搜索常規文件(而不是目錄或其他實體)。 -exec選項指示查找在找到的與之前的規範匹配的每個文件(名稱以「.ext1」結尾的常規文件)上執行指定的命令。我們使用sh來執行該命令,而不是直接調用可執行文件,原因有二:很容易操縱文件名,並且因爲它甚至不能用find來操作文件名:它必須完全按照{}給出。

${0%.ext1}是殼語法,是以文件名(的$0值是文件名,因爲我們發現在經由{}將它作爲第一個參數sh)和剝掉尾隨」 .ext1" 。我們將「.ext2」附加到該結果字符串以獲取所需的輸出文件。

4

bash 4或更高版本中,您可以利用默認設置的globstar選項。

for file in **/*.ext1; do 
    executable -option1 -option2 "$file" > "${file%.ext1}".ext2 
done 
+0

謝謝@chepner! – SIRBA

相關問題