我试图复制一堆文件下面的目录和一些文件有空格和单引号在他们的名字。当我尝试用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。
当前回答
查看一下在xargs中使用——null命令行选项和find中的-print0选项。
其他回答
你可以把所有这些组合成一个find命令:
find . -iname "*foobar*" -exec cp -- "{}" ~/foo/bar \;
这将处理包含空格的文件名和目录。您可以使用name来获得区分大小写的结果。
注意:传递给cp的——标志阻止它处理以-开头的文件。
bill_starr的Perl版本不能很好地用于嵌入换行符(只处理空格)。对于那些没有GNU工具的Solaris,一个更完整的版本可能是(使用sed)…
find -type f | sed 's/./\\&/g' | xargs grep string_to_find
根据需要调整find和grep参数或其他命令,但sed将修复嵌入的换行符/空格/制表符。
对于那些依赖命令,而不是find,例如ls:
find . | grep "FooBar" | tr \\n \\0 | xargs -0 -I{} cp "{}" ~/foo/bar
如果系统上的find和xarg版本不支持-print0和-0开关(例如AIX find和xargs),您可以使用以下看起来很糟糕的代码:
find . -name "*foo*" | sed -e "s/'/\\\'/g" -e 's/"/\\"/g' -e 's/ /\\ /g' | xargs cp /your/dest
这里sed将负责转义xargs的空格和引号。
在AIX 5.3上测试
你可能需要像这样grep Foobar目录:
find . -name "file.ext"| grep "FooBar" | xargs -i cp -p "{}" .