Linux 以GNU并行方式连接目录和文件名

Linux 以GNU并行方式连接目录和文件名,linux,bash,ffmpeg,gnu-parallel,Linux,Bash,Ffmpeg,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 这里的问题是,虽然目录显然有不同的名称,但其中的文件有相同的名称。上述命令将持续覆盖目录的内容。我想要的是:

我有以下目录结构:

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
本质上,我想提取子目录名,并将其与文件basename连接起来,然后放入我自己的扩展名


有什么想法吗?

使用perl转换,此命令应达到所需的效果:

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

Remove
echo
要运行ffmpeg命令

您可以使用
rename
进行快速第一步操作,以将文件重命名,然后在正确的目录中使用GNU Parallel进行格式转换@MarkSetchell谢谢,如果使用
parallel
进行单次传球不是一个选项,那么这是一个有效的选项。有两票声称问题与编程无关@Philippe清楚地证明了它有一个编程解决方案(在Perl中)。也许下一次我会更明确地说,我寻求的是如此有价值的解决方案。几乎就在那里。解决方案的唯一问题是,以这种方式处理的每个文件都会得到一个前缀
,例如
。\u dir1\u file.ogg
。由于我的perl不存在,我非常感谢您帮助修复最后一点。现在更新,请检查,