我尝试了这个 bash 命令:
find /var/www/ -path '*wp-admin/index.php' -exec mv {} $(dirname {})/index_disabled
但第二条{}
没有执行。
其结果只是./index_disabled
相反。
如何在执行命令中两次使用 found 参数?
答案1
您可以使用一个简单的 for 循环来解决这个问题。
for f in $(find /var/www/ -path '*wp-admin/index.php'); do mv $f $(dirname $f)/index_disabled; done
答案2
你的问题不在于它没有被解释两次,因为
find . -type f -exec echo {} {} \;
将显示。问题是{}
不能像您尝试的那样用作函数的参数。根据我(有限的)经验,如果您想巧妙地利用find
和 的内容{}
,您需要编写一个从 调用的 shell 脚本find
,该脚本将其{}
作为其唯一参数,并在该脚本中执行巧妙的操作。
这是一个巧妙脚本的示例:
[me@risby tmp]$ cat /tmp/clever.sh
#!/bin/bash
echo $1 $(dirname $1)/index_disabled
这是我使用它来查找的结果以及结果的最后几行:
[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
正如您所见,如果我echo
在 shellscript 中用替换mv
,我就会得到想要的结果。
答案3
您必须使用xargs
命令和一些技巧:
$ find /var/www/ -path '*wp-admin/index.php' | xargs -i sh -c 'mv {} $(dirname {})/index_disabled'