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

rub*_*o77 4 bash find search-and-replace

我试过这个 bash 命令:

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

但是第二个{}没有执行。

结果只是./index_disabled相反。

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

Mad*_*ter 5

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

find . -type f -exec echo {} {} \;
Run Code Online (Sandbox Code Playgroud)

将会呈现。问题是它{}不能用作函数的参数,正如您所尝试的那样。根据我(有限的)经验,如果您想巧妙处理find和 的内容{},您需要编写一个从 调用的shell 脚本,该脚本find{}其作为唯一的参数,并在其中执行巧妙的操作脚本。

这是一个聪明的脚本示例:

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

这是我将它与 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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,如果我echo在 shellscript 中用替换mv,我会得到想要的结果。

  • 甘拜下风; 我很少遇到这个问题,所以当我遇到这个问题时我会采取“noddy shell script”路线。它还有一个方便的优点,通过使用 `echo` 代替真正的函数,**你可以在真正运行它之前检查它要做什么**,从而避免那种“*我刚刚吹走了 375重要文件,我没有备份,我如何取消删除*”问题,这些问题经常围绕这些部分令人沮丧地被问到。 (3认同)

小智 2

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

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