Como eu uso o operador {} em encontrar a execução dentro de exec

4

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?

    
por rubo77 17.04.2013 / 11:38

3 respostas

2

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
    
por 02.09.2016 / 22:47
4

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.

    
por 17.04.2013 / 11:47
2

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'
    
por 17.04.2013 / 11:53