如何循环遍历所有目录和子目录并查找具有特定扩展名的文件,然后在它们上运行 FFMPEG,然后将它们复制到新的库

如何循环遍历所有目录和子目录并查找具有特定扩展名的文件,然后在它们上运行 FFMPEG,然后将它们复制到新的库

我今天和昨天一直在研究,试图找到解决方案,但到目前为止,没有一个对我有用。

例如:https://stackoverflow.com/questions/5784661/how-do-you-convert-an-entire-directory-with-ffmpeg

我希望能够循环遍历文件夹中的所有文件(例如/Music/),查找以 结尾的任何目录或子目录中的任何文件.flac,然后使用以下命令将这些 flac 文件转换为 alac 文件:

ffmpeg -i "$i" -c copy -acodec alac "${i%.*}.m4a"

$i 变量是 for 循环中文件的“名称”。${i%.*}应该只返回名称,而不是 .flac 部分。

无论如何,在运行该命令后,我希望将所有保存的 .m4a alac 文件发送到“新库”... IE:我将有两个/Music/库。

一个拥有所有 flac 文件

一个拥有所有 alac (m4a) 文件

这可能吗?

这是我到目前为止的命令,绝对不起作用,即使它起作用,它也不会像我想要的那样创建一个新库:for i in *.flac; do ffmpeg -i "$i" -c copy -acodec alac "${i%.*}.m4a"; done

目前该命令只是抛出错误*.flac: No such file or directory,我认为这是因为它没有搜索子目录?...

答案1

#!/bin/bash

shopt -s globstar

src_dir="Music"
dest_dir="Music_new"

for orig_path in "${src_dir}"/**/*.flac; do
    #Change first directory in the path
    new_path=${orig_path/$src_dir/$dest_dir}

    #Remove filename from new path. Only directories are left.
    #They are needed for mkdir
    dir_hier=${new_path%/*}

    #Remove extension .flac from path, thus we have original path with first directory
    #changed and file extension removed.
    #Original path:   "Music/one/two/song.flac"
    #New path:        "Music_new/one/two/song"
    new_path=${new_path%.*}

    echo mkdir -p "$dir_hier"

    #New path with extension:   "Music_new/one/two/song.m4a"
    #ffmpeg should create new file by this path, necessary directories
    #already created by mkdir
    echo ffmpeg -i "$orig_path" -c copy -acodec alac "${new_path}.m4a"
done

echo检查前mkdirffmpeg应在检查后删除。

相关内容