我试图复制一堆文件下面的目录和一些文件有空格和单引号在他们的名字。当我尝试用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。
当前回答
你可能需要像这样grep Foobar目录:
find . -name "file.ext"| grep "FooBar" | xargs -i cp -p "{}" .
其他回答
对于那些依赖命令,而不是find,例如ls:
find . | grep "FooBar" | tr \\n \\0 | xargs -0 -I{} cp "{}" ~/foo/bar
我发现下面的语法很适合我。
find /usr/pcapps/ -mount -type f -size +1000000c | perl -lpe ' s{ }{\\ }g ' | xargs ls -l | sort +4nr | head -200
在本例中,我正在查找挂载在“/usr/pcapps”的文件系统中最大的200个超过1,000,000字节的文件。
Perl在“find”和“xargs”之间的行- - -转义/引用每个空白,因此“xargs”将任何带有嵌入空白的文件名作为单个参数传递给“ls”。
我使用了Bill Star在Solaris上稍作修改的回答:
find . -mtime +2 | perl -pe 's{^}{\"};s{$}{\"}' > ~/output.file
这将在每行周围加上引号。我没有使用“-l”选项,尽管它可能会有所帮助。
我要去的文件列表可能有'-',但没有换行符。我没有使用输出文件与任何其他命令,因为我想回顾什么是发现之前,我只是开始大规模删除他们通过xargs。
我也遇到了同样的问题。以下是我的解决方法:
find . -name '*FoooBar*' | sed 's/.*/"&"/' | xargs cp ~/foo/bar
我使用sed将每一行输入替换为同一行,但是用双引号括起来。在sed手册页中,“…替换中出现的&号('' & ")将被匹配RE…"的字符串替换。"——在本例中,.*表示整行。
这解决了xargs: unterminated quote错误。
最简单的方法来做原来的海报想要的是改变分隔符从任何空白到只是行结束字符,像这样:
find whatever ... | xargs -d "\n" cp -t /var/tmp