2016-03-30 18 views
0

我已經在for循環在bash以下:在多個目錄深度循環工作

for file in "$1"/*PM.mov ; do 
    ffmpeg -i "$file" -an -f framemd5 "${file}.framemd5.txt" 
done 

我想調整它,這樣它會在一個給定的目錄中的所有* PM.mov文件運行不管該文件的目錄深度。現在,循環只能在目錄的頂層運行。我該如何改變它?

回答

0

使用find CMD

for file in $(find $1 -name "*PM.mov") ; do 
    ffmpeg -i "$file" -an -f framemd5 "${file}.framemd5.txt" 
done 
+0

使用'find'命令:是的;但[不要那樣用!](http://mywiki.wooledge.org/ParsingLs)。另一種選擇是使用'globstar':'shopt -s globstar;用於**/* PM.mov中的文件;做...; done'。 –

+1

這樣做會導致包含空格的文件名出現問題。更好地將'find'的輸出重定向到'while'循環。或者更好的是,只需使用'find'命令的'-exec'選項:'find $ 1 -name「* PM.mov」-exec ffmpeg -i「{}」-an -f framemd5「{} .framemd5.txt」 \;' –

1

兩種可能性:

  • 使用globstar(和nullglob雖然我們在它):

    shopt -s globstar nullglob 
    for file in "$1"/**/*PM.mov ; do 
        ffmpeg -i "$file" -an -f framemd5 "${file}.framemd5.txt" 
    done 
    
  • 使用find正確(但前一個是更好,因爲它只是一個微小的改變對你的代碼):

    find "$1" -type f -name "*PM.mov" -exec sh -c 'file=$1; ffmpeg -i "$file" -an -f framemd5 "$file.framemd5.txt"' sh {} \; 
    
+1

出於好奇,爲什麼'sh -c'必要?你不能直接'find'直接執行'ffmpeg'嗎? –

+1

@MikeHolt:事實上,find的大部分版本都可以使用'find'$ 1「-type f -name」* PM.mov「-exec ffmpeg -i {} -an -f framemd5 {} .framemd5.txt \;'但是[由POSIX指定](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html#tag_20_47),_如果utility_name或參數字符串包含兩個字符「{}」,但不僅僅是兩個字符「{}」,它是實現定義的,find是替換這兩個字符還是使用字符串而不用改變。這就是爲什麼要100%確定它可以在任何符合POSIX的系統上工作,我選擇遵守規範。 –

+1

很高興知道。謝謝。 –