在 GNU parallel 中连接目录和文件名

Concatenate directory and file name in GNU parallel

我的目录结构如下:

dir1/file.ogg
dir2/file.ogg
dir3/file.ogg
     file2.ogg

我想使用 GNU Parallel 将所有 .ogg 文件转换为 .wav。这是我到目前为止的进展:

find . -name '*.*' -type f -print0 | parallel -0 ffmpeg -i {} outputdir/{/.}.wav

这里的问题是明明是目录不同名,里面的文件却同名。上述命令会不断覆盖目录的内容。我想要的是:

outputdir/dir1_file.ogg
outputdir/dir2_file.ogg
outputdir/dir3_file.ogg
outputdir/dir3_file2.ogg

本质上,我想提取子目录名称并将其与文件基本名称连接起来,然后放上我自己的扩展名。

有什么想法吗?

使用perl改造,这条命令应该可以达到要求的效果:

find . -name '*.ogg' -type f -print0 | parallel -0 echo ffmpeg -i {} outputdir/{= '$_ =~ s[^\./][]; $_ =~ s[/][_]g; $_ =~ s[ogg$][wav]g;' =}

删除 echo 到 运行 ffmpeg 命令