excluindo pastas com espaços em seus nomes usando xargs [duplicado]

11

Por que os xargs não podem excluir diretórios com espaços em seus nomes e como corrigir isso?

76 find . -type d |xargs  rm -rf
 77 rm -rf fire\ hydrant/
 78 rm -rf wine\ glass/
 79 rm -rf tennis\ racket/
 80 rm -rf traffic\ light/
 81 rm -rf parking\ meter/
 82 rm -rf teddy\ bear/
 83 rm -rf sports\ ball/
 84 rm -rf cell\ phone/
 85 rm -rf stop\ sign/
 86 rm -rf dining\ table/
 87 rm -rf potted\ plant/
    
por Mona Jalal 26.10.2016 / 23:22

3 respostas

24

Corrija-o usando -print0 em find e xargs -0 em xargs para informar aos dois comandos para usar o caractere NULL como um separador em vez de espaço:

find . -type d -print0 | xargs -0 rm -rf

Aqui está uma boa explicação de por que ele quebra e como essa correção funciona a partir de A Linha de Comando Linux de William E. Shotts Jr .

  

Lidando com nomes de arquivo engraçados

     

Sistemas semelhantes a Unix permitem espaços incorporados   (e até mesmo novas linhas!) em nomes de arquivos. Isso causa problemas para programas   como xargs que constroem listas de argumentos para outros programas. A   espaço incorporado será tratado como um delimitador, e o resultado   comando interpretará cada palavra separada por espaço como uma   argumento. Para superar isso, find e xarg permitem o uso opcional de um   caractere nulo como separador de argumento. Um caractere nulo é definido em   ASCII como o caractere representado pelo número zero (ao contrário   para, por exemplo, o caractere de espaço, que é definido em ASCII como   caractere representado pelo número 32). O comando find fornece o   action -print0, que produz saída separada por nulo, e os xargs   comando tem a opção --null, que aceita entrada separada nula.   Veja um exemplo:

find ~ -iname '*.jpg' -print0 | xargs --null ls -l
     

Usando essa técnica, podemos garantir que todos os arquivos, mesmo aqueles   contendo espaços incorporados em seus nomes, são tratados corretamente.

( -0 é a versão curta da opção --null )

    
por Zanna 26.10.2016 / 23:25
17

Você não precisa de xargs , find pode fazer isso de maneira robusta com o manuseio:

  • qualquer tipo de nome de arquivo possível

  • sem acionar ARG_MAX

Se os diretórios estiverem vazios, use -delete action:

find . -type d -delete

Se não estiver vazio, use rm -r na ação -exec :

find . -type d -exec rm -r {} +

Se você insistir em usar xargs , para qualquer nome de diretório sem nova linha em seus nomes, você pode usar a nova linha como o delimitador dos argumentos de entrada:

find . -type d | xargs -d $'\n' rm -r

Melhor maneira, obtenha arquivos NUL separados e lide com a opção -0 de xargs :

find . -type d -name 'foo bar*' -print0 | xargs -0 rm -r

Para todo o rm -r usado, adicione -f , ou seja, rm -rf , se necessário.

    
por heemayl 26.10.2016 / 23:33
2

Para excluir especificamente todos os subdiretórios com espaços em seus nomes, o comando mais simples seria:

find . -type d -name "* *" -exec rm -rf {} +

Esta é a mesma abordagem que a que o heemail já sugeriu, a única diferença é a filtragem -name .

    
por jlliagre 27.10.2016 / 09:46