我想在所有子文件夹中运行以下命令:
for f in *.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "tmp_${f}" && mv "tmp_${f}" "${f}"
done
文件夹结构:在基本文件夹 2019 中,我想在所有子文件夹中执行该命令。每个月都有一个文件夹,即一月“/home/okr/test/2019/01/”
答案1
以下命令将在当前目录的所有子文件夹中递归搜索扩展名为.mp4
( ) 的文件,并使用 选项对每个文件-name "*.mp4"
执行该命令。ffmpeg
-exec
for f in *.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "tmp_${f}" &&
mv "tmp_${f}" "${f}"
done
答案2
递归地:
shopt -s globstar
for f in **/*.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "${f}.tmp" && mv "${f}.tmp" "${f}"
done
答案3
我思考您想要的是cd
进入每个子文件夹并运行命令,您可以这样做:
for dir in */; do
(
cd "$dir"
for f in ./*.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "tmp_${f}" && mv "tmp_${f}" "${f}"
done
)
done
(括号打开一个子 shell,让您可以cd
进入子 shell,而不会影响您在父 shell 中的位置)/
或者您想简单地递归查找所有 mp4 文件并对其运行命令,您可以这样做:
shopt -s globstar
for f in **/*.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "${f}.tmp" && mv "${f}.tmp" "${f}"
done
globstar 选项给出**
来自 ( man bash
) 的哪个:
**
如果设置,路径名扩展上下文中使用的模式 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟/
,则仅目录和子目录匹配。
答案4
for f in **/*.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "${f}.tmp.mp4" && mv "${f}.tmp.mp4" "${f}";
done
谢谢大家的支持!