递归循环遍历某些文件,在每个目录内创建一个目录

递归循环遍历某些文件,在每个目录内创建一个目录

我写了一个简单的 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

相关内容