Como escrito na man page e no padrão, {}
deve estar em um argumento separado.
find / -exec sh -c 'echo $1' dummy '{}' \;
funciona como esperado.
Geralmente não uso o Solaris, mas hoje preciso criar um comando find para executar uma operação em arquivos identificados usando o shell. Estou descobrindo que os caracteres {}
não estão sendo substituídos e não podem encontrar uma alternativa.
Por exemplo:
bash-3.2# find / -exec sh -c "echo {}" \;
Isso faz com que ele imprima {}
para cada arquivo em vez do nome do arquivo.
Como escrito na man page e no padrão, {}
deve estar em um argumento separado.
find / -exec sh -c 'echo $1' dummy '{}' \;
funciona como esperado.
A única maneira padrão de usar find -exec …
é passar {}
como um argumento separado. O comportamento quando um argumento contém {}
não é padronizado. Parece que você está acostumado com o comportamento do GNU, em que {}
é substituído em uma substring. O comando find
no Solaris substitui apenas {}
quando um argumento consiste apenas em {}
.
O comportamento GNU não é particularmente útil, e às vezes irritante, porque substituir um nome de arquivo dentro de um argumento é frágil. A menos que você tenha conhecido restrições nos nomes de arquivos, não há como saber onde um nome de arquivo começa e termina. Por exemplo, com o GNU find, find / -exec sh -c "echo {}" \;
não não imprime os nomes dos arquivos em geral. Apenas imprime os nomes dos arquivos quando eles não contêm nenhum caractere especial do shell. Se você executá-lo em um diretório contendo um arquivo chamado ;rm -r ~
, diga adeus aos seus arquivos.
A maneira confiável (e portátil) de chamar um shell de find -exec
é passar os nomes dos arquivos como um argumento para o shell.
find … -exec sh -c 'echo "$0"' {} \;
Na maioria dos casos, você pode transmitir argumentos em lotes e iterar sobre os argumentos no shell. É um pouco mais rápido. Observe que o primeiro argumento após o código de shell é $0
, o que não é incluído em "$@"
.
find … -exec sh -c 'for x; do echo "$x"; done' _ {} +
Veja também meu shell script engasga com espaço em branco ou outros caracteres especiais?