find/xargs,带空格和引号的文件名

find/xargs,带空格和引号的文件名

我正在寻找一种方法来让findxargs(GNUWin32,在 Win7 下,两个程序的版本均为 4.1)一起使用包含空格的文件名。

获取文件名进入 xargs作为一个挑战,但我似乎找不到办法得到它们出去完整无缺。不幸的是,xargs无论我怎么尝试,引号都会被删除。
这会导致lame(将从 调用xargs) 抱怨多余的参数,因为文件名包含空格。

是的,我知道find-exec选项(没有 也可以工作xargs),但我对此不感兴趣,因为我希望运行 8 个并行实例来lame完成计算密集型批处理任务(重新编码大约 1,800 个 192kbit/s 有声读物 mp3,以便它们可以装入我的播放器的 micro-sd 卡中)。也就是说,xargs -P 8

此命令:

find . -name "*.mp3" -printf "\"%P\" --abr 52 -q 0 --silent \"conv/%P\" " | xargs -n 7

将输出类似以下内容的内容:

path/01.01 foo bar.mp3 --abr 52 -q 0 --silent conv/path/path/01.01 foo bar.mp3

...仍然缺少引号,所以如果我把它放在lame该命令的末尾,它会将其视为path/01.01输入,foo作为输出,并抱怨有一个多余的bar.mp3参数。

  • 我尝试过添加撇号(在引号周围和引号内),但是“xargs”也会将它们删除。
  • -print0也不会做任何事(至少对于我尝试过的任何事来说)。
  • 我尝试-print0printf和进行模拟\0,但无济于事。
  • 同时,我正在考虑将输出重定向到文件并使用文本编辑器添加引号......

答案1

建议用法:

查找...-print0|xargs-0...

...如果您说-print0查找,那么您需要-0xargs。

不管怎样,我经常发现 xargs 很麻烦 - 在这种情况下,我会小心地构建我想要执行的精确命令find -printf,然后最后将其附加| bash到它。

答案2

如果未来的读者需要一个可以在 CygWin 和 GNU Parallel 上运行的解决方案:

find . -name "*.mp3" | parallel lame {} --abr 52 -q 0 --silent conv/{}

相关内容