Como escapar a saída do arquivo para compatibilidade com 'xargs'?

6

Eu tenho este comando:

find $1 | xargs touch

Mas arquivos com ' caracteres em seus nomes falham com "xargs: un quotched as quot quote", e acho que outros caracteres especiais causariam o mesmo problema.

Como posso escapar da saída para que este comando funcione com todos os nomes de arquivos?

    
por Jack Sleight 25.04.2011 / 11:37

3 respostas

7
find $1 -print0 | xargs -0 touch

Isso encerra cada nome de arquivo com \ 000 (caractere 0) e instrui os xargs a esperar que os nomes dos arquivos sejam finalizados por \ 000

   -print0
          True; print the full file name on the standard output,  followed
          by  a  null  character  (instead  of  the newline character that
          -print uses).  This allows file names that contain  newlines  or
          other  types  of white space to be correctly interpreted by pro‐
          grams that process the find output.  This option corresponds  to
          the -0 option of xargs.
    
por 25.04.2011 / 11:41
8

Aqui está a maneira mais simples, rápida e portátil de fazer isso:

find $1 -exec touch {} +

Observe a sintaxe + final. Diferente da sintaxe mais popular \; exec , + está agrupando os argumentos da mesma forma que xargs faz.

Em comparação com o find ... | xargs ... sugerido com frequência, essa solução find é mais eficiente porque:

  • um único processo está lidando com a tarefa inteira
  • não há envolvimento de dados
  • nenhum processamento extra associado ao hack "\ 0" é necessário.

Sendo compatível com POSIX, ele também funciona com a maioria, se não com todas as implementações find atuais, ao contrário de find -print0 e xargs -0 , que são ambos GNUisms.

    
por 25.04.2011 / 14:31
0

Se a sua entrada não for de find , mas de algum outro programa de geração de linha, você pode querer dar uma olhada no GNU Parallel que lida bem com nomes de arquivos contendo '' e espaço:

find | parallel touch

Assista ao vídeo de introdução para saber mais: Parte 1: GNU Processamento e execução de scripts paralelos

    
por 26.04.2011 / 01:03