我正在寻找一种方法来让find
和xargs
(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
也不会做任何事(至少对于我尝试过的任何事来说)。- 我尝试
-print0
用printf
和进行模拟\0
,但无济于事。 - 同时,我正在考虑将输出重定向到文件并使用文本编辑器添加引号......
答案1
建议用法:
查找...-print0|xargs-0...
...如果您说-print0
查找,那么您需要-0
xargs。
不管怎样,我经常发现 xargs 很麻烦 - 在这种情况下,我会小心地构建我想要执行的精确命令find -printf
,然后最后将其附加| bash
到它。
答案2
如果未来的读者需要一个可以在 CygWin 和 GNU Parallel 上运行的解决方案:
find . -name "*.mp3" | parallel lame {} --abr 52 -q 0 --silent conv/{}