linux - 如何让 bash 代码处理文件夹和子文件夹中的所有文件?

标签 linux bash shell sh

我有一个代码,使用 ffmpeg 将文件夹中所有文件的 *.avi 转换为 *.mp4。我希望它在所有文件夹和子文件夹上运行;并将结果保存在此子文件夹中。

我已经尝试过查找但没有成功

#!/bin/bash

for i in *.avi; 
do
    ffmpeg -i /location/"$i" -c:v libx264 -preset ultrafast \
       -strict -2 -n /location/"$(basename  "$i" .avi)".mp4
done

最佳答案

您可以使用 find在所有子目录中查找匹配文件:

find <top-dir> -iname "*.avi" | while read filename; do ffmpeg -i "$filename" ... "${filename%avi}mp4"; done

... 替换为您的 ffmpeg 选项。

您也可以使用 GNU parallel在多个 CPU 上并行处理找到的文件的实用程序:

find <top-dir> -iname "*.avi" | parallel -i -- ffmpeg -i "{}" ... "{.}.mp4"

关于linux - 如何让 bash 代码处理文件夹和子文件夹中的所有文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56457307/

相关文章:

python - 如何仅过滤 Bash(linux)或 Python 文件中的可打印字符?

bash - 如何在 bash 中对子进程进行计时?

linux - 如何在 linux 中创建用户并在用户每次打开 shell 时自动执行命令?

linux - Egrep 与 -f 选项的行为很奇怪

shell - 如何在 korn shell 中转义逗号?

php - Git POST webhook shell_exec

linux - Grep 在不使用管道的情况下获取文件中的字符串

c++ - std::u32string 与 std::string 和 std::u16string 之间的转换

linux - 将路径参数传递给 bash

windows - 将 bash 脚本编译成 Windows 可执行文件