我写了一个简单的 bash 脚本来转换视频文件。运行时,它首先创建output
目录,然后遍历所有.mp4
文件,转换它们并将结果放入output
目录中。
mkdir output && for f in *.mp4; do echo $f; \
ffmpeg -loglevel warning -i $f -vf scale=1280:-2,fps=25 output/$f; done
我想在脚本中添加一项功能:循环遍历所有子目录(但不包括当前目录本身),创建“输出”目录并执行转换。
我设法使用以下代码在所有子目录中找到符合给定标准的所有文件:
for d in */; do
for f in "$d"/*.mp4; do
echo "$d"
file="${f##*/}"
echo "$file"
done
done
该脚本打印以下内容,这是正确的。
1/
01.mp4
2/
02.mp4
然而,我所能做的也仅此而已。
答案1
您可以使用 find 递归搜索目录。
$ find -mindepth 2 -type f ! -path '*/output/*' -name '*.mp4' \
-exec bash -c 'mkdir -p "${1%/*}/output"; ffmpeg -loglevel warning -i "$1" -vf scale=1280:-2,fps=25 "${1%/*}/output/${1##*/}"' _ {} \;
或者使用 globstar 的 for 循环:
#!/bin/bash
shopt -s globstar nullglob
for i in **/*.mp4; do
if [[ $i != */output/* ]]; then
mkdir -p "${i%/*}/output"
ffmpeg -loglevel warning -i "$i" -vf scale=1280:-2,fps=25 "${i%/*}/output/${i##*/}"
fi
done