gnu parallel:文件名中带引号的参数和空格。怎么解决?

gnu parallel:文件名中带引号的参数和空格。怎么解决?

这真让我抓狂。

我有一堆 mp3,我想使用ffmpeg.

我正在尝试使用这一行(脚本更大,这是有问题的部分):

find . -type f \( -iname \*.mp3 \) | parallel ffmpeg -i "{}" -acodec libmp3lame -ab 128k "$output_folder_with_spaces/{.}-128k.mp3" \;

(该iname部分存在是因为将来可能会使用更多扩展)

但即使使用引号{},我总是得到No such file or directory,因为 mp3 已命名01 - My song。我也不知道是否"$output_folder_with_spaces"会起作用。

我在谷歌上搜索了很多,但找不到这个例子:使用{}fromfind包含{}空格。我只发现在引号中使用变量或硬编码路径时。

有人知道在这种情况下我该如何解决这个空间问题吗?

答案1

您使用了错误的替换字符串parallel;您还需要-q传递带引号的参数,我不确定尾随的作用\;是什么...
示例:

dirname_with_spaces="/home/don/my dir with spaces/"

/(请注意分配给 的路径中的尾随dirname_with_spaces)以及目录mp3下的一些带有空格的文件名test,就在cwd:

./test/Commercial DEMO - 09.mp3
./test/Commercial DEMO - 11.mp3
./test/Handel Royal Fireworks - 07.mp3
./test/Jazz Rag Ensemble - 10.mp3
./test/Mouret - Rondeau.mp3

使用

find . -type f -iname \*.mp3 | parallel -q ffmpeg -i {} -acodec \
libmp3lame -ab 128k "$dirname_with_spaces"{/.}-128k.mp3

产生以下文件:

/home/don/my dir with spaces/Commercial DEMO - 11-128k.mp3
/home/don/my dir with spaces/Commercial DEMO - 09-128k.mp3
/home/don/my dir with spaces/Handel Royal Fireworks - 07-128k.mp3
/home/don/my dir with spaces/Jazz Rag Ensemble - 10-128k.mp3
/home/don/my dir with spaces/Mouret - Rondeau-128k.mp3

请注意命令行quoting ( parallel -q) 和以下命令的用法:

{}
    Input line.

find这意味着来自输出的路径,例如./test/Mouret - Rondeau.mp3

{/.}
    Basename of input line without extension. 

扩展为Mouret - Rondeau然后 "$dirname_with_spaces"{/.}扩展为/home/don/my dir with spaces/Mouret - Rondeau

后者与{.}您的命令中使用的有很大不同

{.}
    Input line without extension.

它将扩展到./test/Mouret - Rondeau然后 "$dirname_with_spaces"{.}将扩展到/home/don/my dir with spaces/./test/Mouret - Rondeau。显然,这会出错,因为没有/./test/under /home/don/my dir with spaces

答案2

您误解了find的语法。该{}语法与 结合使用-exec。另外,你不需要那些括号;仅当您想覆盖默认的操作顺序(例如,不从左到右评估)时才需要它们。总的来说,对于 exec,它看起来像这样(分割以避免水平滚动):

find . -type f -iname \*.mp3 -exec \
    ffmpeg -i "{}" -acodec libmp3lame -ab 128k \
    "$output_folder_with_spaces/{}-128k.mp3" \;

请注意,这将为您提供名为foo.mp3-128.mp3...的文件,我希望这就是您想要的;我不知道这{.}是什么意思——这不是有效的语法,至少对于 GNU find 来说是这样。

我建议lame直接使用,而不是通过 FFmpeg (如果-ab使用 ABR 模式而不是 VBR 模式,我会建议在没有充分理由的情况下反对)。实际上,我建议不要对 MP3 进行重新编码;通过从无损源进行编码,可以在相同比特率下获得更好的质量。

相关内容