遍历子目录中的所有媒体文件

时间:2015-05-01 21:27:44

标签: linux bash unix

我正在尝试循环浏览几个mp4文件并转换为其他格式。以下工作,但它只转换一个文件,循环停止。最初文件位于文件夹videos中,当我转换后,我移动到文件夹formatted_vids。如何正确循环所有mp4文件?

FILE_PATH="/media/videos/"
 find $FILE_PATH -name "*.mp4" | while read file
         do
            filename=$(basename "$file")
            extension="${filename##*.}"
            video_file="${filename%.*}"
            dir="/media/formatted_vids/${filename%.mp4}"
            mkdir -p "$dir"
            mv "$file" "$dir"

            ffmpeg -i $dir/${filename} -c:a libfdk_aac -vbr 3 output.m4a "$dir/${filename%.mp4}-%03d.m4a";

        done

初始文件夹

|-- /media/videos/
    |   |-- xxxx-test_file-aa1
    |       |--xxxx-test_file-aa1.mp4
    |   |-- xxxx-test_file-bb2
            |--xxxx-test_file-bb2.mp4

将文件移至文件夹:

|-- /media/formatted_vids/
    |   |-- xxxx-test_file-aa1
    |       |--xxxx-test_file-aa1.aac
    |   |-- xxxx-test_file-bb2
            |--xxxx-test_file-bb2.aac

1 个答案:

答案 0 :(得分:0)

如果文件名或路径包含空格,则lashgar的答案将中断。

请尝试以下操作以获取包含空格支持的解决方案

find $FILE_PATH -name "*.mp4" -print0 | 
while IFS= read -r -d '' file; do
  filename=$(basename "$file")
  extension="${filename##*.}"
  video_file="${filename%.*}"
  dir="/media/formatted_vids/${filename%.mp4}"
  mkdir -p "$dir"
  mv "$file" "$dir"
  ffmpeg -i $dir/${filename} -c:a libfdk_aac -vbr 3 output.m4a "$dir/${filename%.mp4}-%03d.m4a" < /dev/null
done

请注意,我必须在ffmpeg命令的末尾添加一个< /dev/null,这是为了避免使用this error

在具有空间支持的while循环中,信贷转到this answer

在修复自己的媒体转换脚本时遇到了这个问题。如果有人对我的脚本感兴趣,该脚本可将具有HEVC编码的mkv视频文件转换为具有AVC编码的mpg文件,您可以找到它here