Você quer
find <whatever> -print0 | xargs -0 rm -rf
Eu costumo usar a linha de comando abaixo para remover diretórios no sistema de arquivos. Mas, pela primeira vez, find
está retornando nomes com espaços em branco e rm
não reconhece.
find . -name .AppleDouble* -exec rm -rf {} \;
Ele gera o seguinte erro: find: './Aerosmith/Young Lust/.AppleDouble': No such file or directory
É possível alcançá-lo usando apenas uma única linha como esta? Ou devo usar algum tipo de script? Se o script é a solução, por favor, você poderia postar um exemplo?
Ao contrário do que as pessoas vão assumir primeiro é o problema, o problema que você está tendo não é com os espaços no nome do arquivo. {}
passará corretamente o nome do arquivo para rm. O problema que você está tendo é que find
, por padrão, é bredth first, não depth first. find
não tem idéia do que o comando rm
está fazendo, então depois de você rm
, find está tentando cd no diretório que você acabou de remover, e você recebe um erro de arquivo não encontrado, porque o diretório tenta para o cd se foi.
@ resposta da womble funciona porque atrasa a remoção do diretório. Ele procurará no diretório por outras coisas para remover do diretório primeiro. Isso não é eficiente, já que é bobagem procurar por arquivos para remover em um diretório se você for remover o diretório inteiro de qualquer maneira.
No GNU find, você pode usar a ação -delete:
find . -name .AppleDouble* -delete
E a localização será inteligente o suficiente para fazer a coisa certa.
find . -name .AppleDouble* -exec rm -rf {} +
(usando + em vez de; para terminar o comando) É equivalente ao comando @ womble usando xargs, ele terá o efeito de ações de buffering até varrer todo o diretório ou ficar sem espaço na linha de comando para rm, mas ele sofrerá com o mesmo problema, pois está procurando, inutilmente, por arquivos a serem removidos, que definitivamente serão removidos de qualquer maneira.