2013-11-22 108 views
1

如果我想遍歷一個嵌套目錄列表並運行set命令,我該怎麼做?Shell腳本 - 通過目錄循環?

我的目錄結構是這樣的:

  • 視頻
    • 文件夾1 - > VTS_01_1.mp4
    • 文件夾2 - > VTS_01_1.mp4
    • folder3 - > VTS_01_1.mp4 ....等等

我需要遍歷每個文件夾並運行下面的腳本。所有的.mp4文件都命名爲VTS_01_1.mp4,但我想用* .mp4通配符條件來執行它,因爲它們不是'噸。每個目錄中的輸出文件應該是「VTS_01_h264.mp4」。想法?我正在使用CentOS 6.4。

ffmpeg -y -i "VTS_01_1.mp4" -an -pass 1 -threads 2 -vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \ 
     -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \ 
     -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \ 
     -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \ 
      -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\ 
     -qmax 51 -qdiff 4 "video_tmp.mp4" 



ffmpeg -y -i "VTS_01_1.mp4" -acodec libfaac -ar 44100 -ab 96k -pass 2 -threads 2 -vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \ 
     -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \ 
     -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \ 
     -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \ 
      -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\ 
     -qmax 51 -qdiff 4 "video_tmp.mp4" 



qt-faststart "video_tmp.mp4" "VTS_01_h264.mp4" 
+1

沒有理由讓你申報這麼多的選擇。這就是x264預設的用途。你可以簡化命令:'ffmpeg -y -i input -an -pass 1 -vcodec libx264 -preset slow -b:v 512k -f mp4/dev/null && ffmpeg -i input -pass 2 -vcodec libx264 -preset slow -b:v 512k -acodec libfaac -ar 44100 -b:一個96k -movflags faststart output.mp4第一遍輸出可以發送到'/ dev/null','-b'不明確,所以你應該指定stream,你可以在第二遍中用'-movflags faststart'選項替換'qt-faststart'。 – LordNeckbeard

回答

2

find命令是這樣的事情很厲害,試試:

find videos/ -name "*.mp4" -exec ffmpegScript {} \; 

這找到的所有文件(也子目錄中)與.mp4作爲結尾並執行ffmpegScript nameOfMp4File,其中nameOfMp4File是的名稱一次發現一個文件。 find負責循環本身。

現在,我們需要定義ffmpegScript

#!/usr/bin/env bash 

inputFile="$1" 
outputFile="$(dirname $1)"/VTS_01_h265.mp4 

ffmpeg -y -i "$inputFile" -acodec libfaac -ar 44100 -ab 96k -pass 2 -threads 2 -vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \ 
    -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \ 
    -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \ 
    -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \ 
     -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\ 
    -qmax 51 -qdiff 4 "video_tmp.mp4" 

qt-faststart "video_tmp.mp4" "$outputFile" 

inputFile變量設置爲傳遞到ffmpegscript第一位置參數,該outputFile變量被設置使用相同的路徑,但不同的basename

注意:如果目錄中有多個*.mp4文件,此腳本將覆蓋您的輸出文件。此外,我沒有嘗試整個腳本,因爲我沒有任何*.mp4這裏可用的文件。

2
#!/usr/bin/env bash 

set -x 

#----------+code---------- 
find *.mp4 -maxdepth 3 -type f | while read files 
do 
./ffmpeg.sh "${files}" 

qt-faststart "${files}_tmp.mp4" "VTS_01_h264.mp4" 
done 
#----------.code---------- 

而且在ffmpeg.sh:-

#!/usr/bin/env bash 

set -x 

#----------+code---------- 
ffmpeg -y -i "${1}" -an -pass 1 -threads 2 -vcodec \ 
    libx264 -b 512k -flags +loop+mv4 -cmp 256 \ 
    -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \ 
    -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \ 
    -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \ 
    -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\ 
    -qmax 51 -qdiff 4 "${1}_tmp.mp4" 
#----------.code----------