我今天和昨天一直在研究,试图找到解决方案,但到目前为止,没有一个对我有用。
例如: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
检查前mkdir
并ffmpeg
应在检查后删除。