在命令替换中使用find(1)和带空格的报价文件名
问题描述:
我想在命令替换中使用find,其中返回的文件名包含空格。我需要什么选项才能正确引用文件名?我试过-print0
,但它不会在shell本身中工作。在命令替换中使用find(1)和带空格的报价文件名
例如:
command $(find . -type f) some other params
我也试图与-exec echo "{}" \;
,但是这是没有帮助的。
如果我使用set -x
显示shell扩展和被执行的实际命令我得到:
$ command `find -type f -printf \"%p\"\ ` some other params
++ find -type f -printf '"%p" '
+ command '"./file_with' 'blanks"' '"./another' 'file"' some other params
哪里来自的单引号,他们为什么应用于每个“单词” ?
答
find /what/ever -name "what ever" -exec echo "\{\}" \;
在这里工作(使用bash的Ubuntu 10.04默认gterm)
刚试过
find /bin -name ls -exec \{\} -lah \;
`find /bin -name ls -exec echo \{\} \;` -lah
MYCMD=`find /bin -name ls -exec echo \{\} \;` && $MYCMD -lah
MYCMD=$(`find /bin -name ls -exec echo \{\} \;` -lah) && echo $MYCMD
MYCMD=$(`find /bin -name ls` -lah) && echo $MYCMD
预期
答
也许printf
动作更易于被包含在一个替代(GNU find
只,虽然):
command $(find . -type f -printf \"%P\"\) some other params
的%P
占位符是在比find .
其他情况下,文件名减去参数find
,所以,你可能会想要%p
。
您是否知道xargs? '找。 -type f -print0 | xargs -0 yourCmd opts'? xargs会将find的N个输出“feed”到'yourCmd'并持续重复,直到完成所有输出。 Xargs是在GnuLinux中将查找输出传递给命令的首选方式(与旧的Unix Solaris/HP/etc不同)。可能有一些关于'yourCmd'的问题妨碍了这个工作,但以上是开始的地方。祝你好运。 – shellter 2012-02-09 15:42:36
我知道'xargs'(应该在问题中提到过),但该命令应该只执行一次,而不是每个输入文件一次。我需要一步完成传递给命令的完整文件列表。 (从xargs尝试'-L'和'-n') – knittl 2012-02-09 15:45:25
我关于'xargs将输入N个输出'的观点意味着xargs将使用尽可能多的参数来放置yourCmd,因为它可以适用于命令行的一次执行,并且只有rexecute yourCmd(如果需要的话)。对?如果你需要处理100000个文件,不会使用'yourCmd $(find。-type f)',你会得到一个msg,比如'文件名太多'Xargs是通过执行你的Cmd来帮助解决这类问题的尽可能少的次数。给出通过xargs的10个文件的列表,yourCmd将只运行1次,而不是10次。祝你好运。 – shellter 2012-02-09 16:16:38