我想在所有子文件夹中运行以下命令:
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中,我想在所有子文件夹中执行命令。每个月都有一个文件夹,即1月的"/home/okr/test/2019/01/“。
发布于 2023-01-20 11:16:14
递归地:
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发布于 2023-01-20 11:18:46
我认为您想要的是将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,它允许您在子shell中cd而不影响您在父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}"
doneglobstar选项为您提供了**,它来自(man bash):
如果设置,则路径名称扩展上下文中使用的模式
**将匹配所有文件以及零或多个目录和子目录。如果模式后面跟着一个/,那么只有目录和子目录匹配。
发布于 2023-01-20 11:30:10
下面的命令将递归地搜索当前目录的所有子文件夹,查找具有.mp4扩展名(-name "*.mp4")的文件,并使用-exec选项对每个文件执行ffmpeg命令。
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 https://unix.stackexchange.com/questions/732451
复制相似问题