我试图复制一堆文件下面的目录和一些文件有空格和单引号在他们的名字。当我尝试用xargs将find和grep串在一起时,我得到以下错误:
find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar
xargs: unterminated quote
对于更健壮地使用xargs有什么建议吗?
这是在Mac OS X 10.5.3 (Leopard)上使用BSD xargs。
我试图复制一堆文件下面的目录和一些文件有空格和单引号在他们的名字。当我尝试用xargs将find和grep串在一起时,我得到以下错误:
find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar
xargs: unterminated quote
对于更健壮地使用xargs有什么建议吗?
这是在Mac OS X 10.5.3 (Leopard)上使用BSD xargs。
当前回答
如果你正在使用Bash,你可以通过mapfile将stdout转换为一个行数组:
find . | grep "FooBar" | (mapfile -t; cp "${MAPFILE[@]}" ~/foobar)
好处是:
它是内置的,所以更快。 一次执行所有文件名的命令,因此速度更快。 您可以将其他参数附加到文件名。对于cp,您还可以: 找到。-name '*FooBar*' -exec cp -t ~/ FooBar——{}+ 但是,有些命令不具备这样的特性。
的缺点:
如果文件名太多,可能伸缩性不好。(极限?我不知道,但我已经测试了10 MB的列表文件,其中包括10000多个文件名没有问题,在Debian下)
嗯…谁知道Bash在OS X上是否可用呢?
其他回答
我使用了Bill Star在Solaris上稍作修改的回答:
find . -mtime +2 | perl -pe 's{^}{\"};s{$}{\"}' > ~/output.file
这将在每行周围加上引号。我没有使用“-l”选项,尽管它可能会有所帮助。
我要去的文件列表可能有'-',但没有换行符。我没有使用输出文件与任何其他命令,因为我想回顾什么是发现之前,我只是开始大规模删除他们通过xargs。
此方法适用于Mac OS X v10.7.5 (Lion):
find . | grep FooBar | xargs -I{} cp {} ~/foo/bar
我还测试了你发布的确切语法。这在10.7.5上也能正常工作。
如果你正在使用Bash,你可以通过mapfile将stdout转换为一个行数组:
find . | grep "FooBar" | (mapfile -t; cp "${MAPFILE[@]}" ~/foobar)
好处是:
它是内置的,所以更快。 一次执行所有文件名的命令,因此速度更快。 您可以将其他参数附加到文件名。对于cp,您还可以: 找到。-name '*FooBar*' -exec cp -t ~/ FooBar——{}+ 但是,有些命令不具备这样的特性。
的缺点:
如果文件名太多,可能伸缩性不好。(极限?我不知道,但我已经测试了10 MB的列表文件,其中包括10000多个文件名没有问题,在Debian下)
嗯…谁知道Bash在OS X上是否可用呢?
找到。-print0 | grep——null 'FooBar' | xargs -0…
我不知道grep是否支持-null,也不知道xargs是否支持-0,在Leopard上,但在GNU上都很好。
对我来说,我想做一些不一样的事情。我想复制我的txt文件到我的tmp文件夹。txt文件包含空格和撇号。这在我的Mac上很管用。
$ find . -type f -name '*.txt' | sed 's/'"'"'/\'"'"'/g' | sed 's/.*/"&"/' | xargs -I{} cp -v {} ./tmp/