如何在 exec 中的 find 执行中使用 {} 运算符

如何在 exec 中的 find 执行中使用 {} 运算符

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

相关内容