我试图复制一堆文件下面的目录和一些文件有空格和单引号在他们的名字。当我尝试用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。
当前回答
找到。-print0 | grep——null 'FooBar' | xargs -0…
我不知道grep是否支持-null,也不知道xargs是否支持-0,在Leopard上,但在GNU上都很好。
其他回答
找到。-print0 | grep——null 'FooBar' | xargs -0…
我不知道grep是否支持-null,也不知道xargs是否支持-0,在Leopard上,但在GNU上都很好。
find | perl -lne 'print quotemeta' | xargs ls -d
我相信这对于除换行以外的任何字符都是可靠的(并且我怀疑如果您的文件名中有换行,那么您将遇到比这更糟糕的问题)。它不需要GNU findutils,只需要Perl,所以它应该可以在任何地方工作。
我发现下面的语法很适合我。
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”。
对于那些依赖命令,而不是find,例如ls:
find . | grep "FooBar" | tr \\n \\0 | xargs -0 -I{} cp "{}" ~/foo/bar
这更有效,因为它不会多次运行“cp”:
find -name '*FooBar*' -print0 | xargs -0 cp -t ~/foo/bar