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