Shell脚本-循环目录?

Shell脚本-循环目录?,shell,ffmpeg,centos,mp4,h.264,Shell,Ffmpeg,Centos,Mp4,H.264,如果我想在嵌套目录列表中循环并运行一组命令,我该怎么做 我的目录结构如下: 录像带 折叠1 ->VTS_01_1.mp4 折叠2 ->VTS_01_1.mp4 折页3 ->VTS_01_1.mp4 .... 等等 我需要遍历每个文件夹并运行下面的脚本。。所有的.mp4文件都被命名为VTS_01_1.mp4,但我想使用*.mp4通配符条件来实现它,以防它们不是。每个目录中的输出文件应为“VTS_01_h264.mp4”。思想?我使用的是CentOS 6.4 ffmpeg -y -i "VT

如果我想在嵌套目录列表中循环并运行一组命令,我该怎么做

我的目录结构如下:

  • 录像带
    • 折叠1 ->VTS_01_1.mp4
    • 折叠2 ->VTS_01_1.mp4
    • 折页3 ->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"

在这种情况下,
find
命令非常强大,请尝试:

find videos/ -name "*.mp4" -exec ffmpegScript {} \;
这将查找以
.mp4
结尾的所有文件(也在子目录中),并执行
ffmpegScript nameomm4file
,其中
nameomm4file
是找到的文件的名称,一次一个<代码>查找负责循环本身

现在我们需要定义
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
文件。

查找
命令在这方面非常强大,请尝试:

find videos/ -name "*.mp4" -exec ffmpegScript {} \;
#!/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----------
这将查找以
.mp4
结尾的所有文件(也在子目录中),并执行
ffmpegScript nameomm4file
,其中
nameomm4file
是找到的文件的名称,一次一个<代码>查找
负责循环本身

现在我们需要定义
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
文件

#!/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----------
在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----------

您没有理由声明这么多选项。这就是x264预设的用途。您可以将命令简化为:
ffmpeg-y-i输入-an-pass 1-vcodec libx264-preset slow-b:v 512k-f mp4/dev/null&&ffmpeg-i输入-pass 2-vcodec libx264-preset slow-b:v 512k-acodec libfaac-ar 44100-b:a 96k-movflags faststart输出。mp4
第一次通过的输出可以发送到
/dev/null
-b
不明确,因此您应该指定流,并且您可以在第二遍中用
-movflags faststart
选项替换
qt faststart
。您没有理由声明这么多选项。这就是x264预设的用途。您可以将命令简化为:
ffmpeg-y-i输入-an-pass 1-vcodec libx264-preset slow-b:v 512k-f mp4/dev/null&&ffmpeg-i输入-pass 2-vcodec libx264-preset slow-b:v 512k-acodec libfaac-ar 44100-b:a 96k-movflags faststart输出。mp4
第一次通过的输出可以发送到
/dev/null
-b
不明确,因此您应该指定流,并且您可以在第二遍中用
-movflags faststart
选项替换
qt faststart