Por que o Solaris 10 encontra / -exec sh -c “echo {}” \; imprime “{}” em vez de nomes de arquivos?

1

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.

    
por Craig 21.03.2016 / 18:57

2 respostas

1

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.

    
por 21.03.2016 / 19:13
1

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?

    
por 22.03.2016 / 02:26

Tags