在命令替换中使用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 

哪里来自的单引号,他们为什么应用于每个“单词” ?

+0

您是否知道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

+0

我知道'xargs'(应该在问题中提到过),但该命令应该只执行一次,而不是每个输入文件一次。我需要一步完成传递给命令的完整文件列表。 (从xargs尝试'-L'和'-n') – knittl 2012-02-09 15:45:25

+0

我关于'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

find result in an array,并运行command "${array[@]}" some other params所有的工作。

+0

'command“$ {array [@]}”some其他params'终于为我做了诡计。但是,男孩,这是复杂的... – knittl 2012-02-09 16:12:58

+0

不幸的是Bash是一种语言,其中空白是非常复杂的,如果你想在所有情况下正确处理它。 – l0b0 2012-02-09 16:14:52

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 

预期

+0

»无法打开文件:\ {\}«。命令替换为结果添加了一些其他层引起的恐惧... – knittl 2012-02-09 15:40:15

+0

编辑我的回答 – 2012-02-09 15:48:36

+0

'/ bin/sh'不包含任何有趣的(空格)字符...... – knittl 2012-02-09 15:51:25

也许printf动作更易于被包含在一个替代(GNU find只,虽然):

command $(find . -type f -printf \"%P\"\) some other params 

%P占位符是在比find .其他情况下,文件名减去参数find,所以,你可能会想要%p