如何使用xargs复制文件名带有空格和引号的文件?

253

我正在尝试复制一个目录下的一堆文件,其中一些文件名中有空格和单引号。 当我尝试使用findgrepxargs一起运行时,我会得到以下错误:

find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar
xargs: unterminated quote

有没有更加强大的使用 xargs 的建议?

我是在使用 BSD 版本的 xargs,系统为 Mac OS X 10.5.3(Leopard)。


2
GNU xargs 的错误信息对于包含单引号的文件名更有帮助: "xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option". - Steve Jessop
3
GNU xargs也有--delimiter选项(-d)。尝试使用\n作为分隔符,这可以防止xargs将带空格的行分隔成多个单词/参数。 - MattBianco
22个回答

0

你可能需要像这样使用grep命令搜索Foobar目录:

find . -name "file.ext"| grep "FooBar" | xargs -i cp -p "{}" .

1
根据 man 页面,-i 已经被弃用,应该使用 -I - Asclepius

-1
如果您正在使用Bash,可以通过mapfilestdout转换为行数组:
find . | grep "FooBar" | (mapfile -t; cp "${MAPFILE[@]}" ~/foobar)

好处有:

  • 它是内置的,所以更快。
  • 一次性执行所有文件名的命令,所以更快。
  • 您可以将其他参数附加到文件名。对于cp,您还可以:

    find . -name '*FooBar*' -exec cp -t ~/foobar -- {} +
    

    但是,有些命令没有这样的功能。

缺点:

  • 如果文件名太多,可能无法很好地扩展。(极限是什么?我不知道,但我在Debian下测试了一个包含10000多个文件名的10 MB列表文件,没有任何问题)

嗯...谁知道OS X上是否有Bash可用呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接