Agora estamos todos familiarizados com não usar:
find . -print | xargs cmd
mas usando
find . -print0 | xargs -0 cmd
Para lidar com nomes de arquivos contendo, por exemplo, nova linha, mas e uma linha que tenho em um script:
find $@ -type f -print | while read filename
Bem, imaginei que seria algo como:
find $@ -type f -print0 | while read -d"\0" filename
E se eu simplesmente tivesse feito:
find $@ -type f -print0 | while read filename
Eu estaria vendo os NULLs?
Mas não, o loop while sai após zero vezes (em ambos os casos) eu assumo porque a leitura retornou zero, também assumo porque leu um NULL (\0) .
Parece que a leitura do bash deve ostentar uma opção "-0" .
Eu interpretei mal o que está acontecendo ou há uma maneira diferente de enquadrar isso?
Para este exemplo, posso muito bem ter que recodificar para usar xargs, mas isso é um monte de novos processos que não queria bifurcar.
Ao usar
read
, você pode usar apenas-d ''
para ler até o próximo caractere nulo.Do
bash
manual, em relação aoread
utilitário integrado:Você provavelmente também deseja definir
IFS
como uma string vazia para pararread
de cortar espaços em branco flanqueados dos dados e usarread
with-r
para poder ler strings contendo barras invertidas corretamente. Você também precisa colocar aspas duplas na expansão$@
se quiser que seu script ou função shell suporte caminhos de pesquisa contendo novas linhas, espaços, caracteres globbing de nome de arquivo, etc:Pessoalmente, eu não passaria nomes de caminho
find
se não fosse desesperadamente necessário, mas executaria as operações necessárias via-exec
, por exemplo,Tópicos relacionados: