我如何使用{}运算符在执行中查找执行

我试过这个bash命令:

find /var/www/ -path '*wp-admin/index.php' -exec mv {} $(dirname {})/index_disabled 

但是第二个{}不被执行。

它只会./index_disabled

如何在执行命令中使用find的参数两次?

你可以使用一个简单的循环来解决这个问题。

 for f in $(find /var/www/ -path '*wp-admin/index.php'); do mv $f $(dirname $f)/index_disabled; done 

你的问题不是它没有被解释两次,就是这样做

 find . -type f -exec echo {} {} \; 

将会呈现。 问题是, {}不能用作函数的参数,因为你正在尝试。 在我的(有限的)经验中,如果你想要find{}的内容,你需要编写一个从find调用的shell脚本,它将{}作为唯一的参数,在脚本里面做聪明的事情。

下面是一个巧妙的脚本示例:

 [me@risby tmp]$ cat /tmp/clever.sh #!/bin/bash echo $1 $(dirname $1)/index_disabled 

这里是我用它find,结果的最后几行:

 [me@risby tmp]$ find . -type f -exec /tmp/clever.sh {} \; [...] ./YubiPAM-1.1-beta1/stamp-h1 ./YubiPAM-1.1-beta1/index_disabled ./YubiPAM-1.1-beta1/depcomp ./YubiPAM-1.1-beta1/index_disabled ./YubiPAM-1.1-beta1/INSTALL ./YubiPAM-1.1-beta1/index_disabled 

正如你所看到的,如果我用mvreplaceshell中的echo ,我会得到期望的结果。

你将不得不使用xargs命令和一个小技巧:

 $ find /var/www/ -path '*wp-admin/index.php' | xargs -i sh -c 'mv {} $(dirname {})/index_disabled'