Para usar várias instruções, como for
-loop, como o argumento para -exec
, é necessário invocar um shell, como bash
, explicitamente:
find .. -name bin -exec bash -c 'for file in "$1"/* ; do echo "$file" ; done' none {} \;
Isso é seguro até mesmo para nomes de arquivos que contenham espaços ou outros caracteres hostis.
Como o bash -c
funciona
Pode-se invocar o bash com um comando do formulário:
bash -c some_complex_commands arg0 arg1 arg2 ...
Nesse caso, o bash executará o que estiver na string some_complex_commands
. Esses comandos podem fazer uso dos parâmetros posicionais de shell comuns . O primeiro argumento após o comando, arg0
acima, é atribuído a $0
, o segundo a $1
, o terceiro a $2
, etc.
Quando alguém executa um script de shell normal, $0
é o nome do script e $1
é o primeiro argumento que aparece na linha de comando. De acordo com essa tradição, o comando bash -c
foi escrito para atribuir o nome do arquivo, {}
na notação de find, a $1
. Como esse script não tem um nome sensato, none
é atribuído como um espaço reservado para $0
.