首页 > 解决方案 > 如何让 bash 代码处理文件夹和子文件夹中的所有文件?

问题描述

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

我已经尝试过 find 但没有成功

#!/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

标签: linuxbashshellsh

解决方案


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

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

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

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

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

推荐阅读