2016-06-19 69 views
2

我有一个包含.flac文件的多个子目录的目录。我想批量转换它们到.mp3。路径名称包含空格。现在我想要做这样的事情在多个目录中查找批处理文件

find . -type f -regex .*.flac -exec ffmpeg -i {} -c:a mp3 -b:a 320k \; 

但问题是,我该如何使用mp3{}和替代flac给ffmpeg的输出文件名?在bash中,可以使用变量替换${file%.flac}.mp3,但我不能在这里应用。基于sed的方法似乎也不适用于find。 有没有简单的解决方案呢?

+1

Btw。报价'* .flac'。 – Cyrus

回答

3

如果你正在使用bash,我会使用globstar,这将扩大到所有.flac文件的列表:

shopt -s globstar nullglob 
for file in **/*.flac; do 
    [[ -f $file ]] || continue 
    out_file=${file%.flac}.mp3 
    ffmpeg # your options here, using "$out_file" 
done 

支票[[ -f $file ]]跳过,在.flac结尾的所有目录。如果你没有这些,你可以跳过这个。

我也启用了nullglob shell选项,以便与任何文件不匹配的模式展开为空(因此循环将不会运行)。

+0

那么你应该得到我的加号':)'。 –

2

如果你真的想要使用find(例如,你用Bash的古董版卡在过去,globstar不可用 - 所以使用Tom Fenech的解决方案不是一种选择),你必须产生一个shell来做替换。该标准的方式是:

find . -name '*.flac' -type f -exec sh -c 'ffmpeg -i "$1" -c:a mp3 -b:a 320k "${1%.flac}.mp3"' dummy {} \; 

sh -c将运行第一个参数,和子序列参数被设置为位置参数0开始。这就是为什么我把一个虚拟参数(我称之为dummy,但其他任何东西都可以)。

请注意,在find-name中,需要引用参数*.flac。出于某种原因,你编辑了你的帖子,并用谓词-regex谓词替换了谓词:它实际上是无用的,你仍然需要引用这个论点。

+0

是不可能写'sh -c'ffmpeg -i“$ 0”-c:一个mp3 -b:一个320k“$ {1%.flac} .mp3”'{} \;' –

+1

@mona_sax:nope ,因为在这种情况下,位置参数'$ 1'没有被设置,所以这不是很有效!也许你的意思是:'sh -c'ffmpeg -i“$ 0”-c:一个mp3 -b:一个320k“$ {0%.flac} .mp3”'{} \;',这是完全有效的。 –

+1

嗯是的!我的意思不是你刚才指出的。 :)。我想避免使用虚拟变量。这实际上是一个优雅的单线:) +1 –

相关问题