在所有子文件夹中运行命令

在所有子文件夹中运行命令

我想在所有子文件夹中运行以下命令:

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

谢谢大家的支持!

相关内容