我试过这个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'