Você pode usar um loop for simples para resolver isso.
for f in $(find /var/www/ -path '*wp-admin/index.php'); do mv $f $(dirname $f)/index_disabled; done
Eu tentei este comando bash:
find /var/www/ -path '*wp-admin/index.php' -exec mv {} $(dirname {})/index_disabled
Mas o segundo {} não é executado.
Isso resulta em apenas ./index_disabled .
Como posso usar o parâmetro encontrado duas vezes no comando execute?
Seu problema não é que não seja interpretado duas vezes, como se estivesse fazendo
find . -type f -exec echo {} {} \;
será exibido. O problema é que {} não pode ser usado como um argumento para uma função, como você está tentando. Na minha (limitada) experiência, se você quiser ficar esperto com find e o conteúdo de {} , será necessário escrever um script de shell chamado find , que usa {} como único. e apenas argumento, e isso faz as coisas inteligentes dentro desse script.
Veja um exemplo de script inteligente:
[me@risby tmp]$ cat /tmp/clever.sh
#!/bin/bash
echo $1 $(dirname $1)/index_disabled
Aqui está eu usando com o find e as últimas linhas dos resultados:
[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
Como você pode ver, se eu substituí echo no shellscript por mv , eu obteria o resultado desejado.
Você terá que usar o comando xargs e um pequeno truque:
$ find /var/www/ -path '*wp-admin/index.php' | xargs -i sh -c 'mv {} $(dirname {})/index_disabled'
Tags bash find search-and-replace