find -delete não exclui diretórios não vazios

29

O comando

$ find ~ -name .DS_Store -ls -delete

funciona no Mac OS X, mas

$ find ~ -name __pycache__ -type d -ls -delete

não - os diretórios são encontrados, mas não excluídos.

Por quê?

PS. Eu sei que posso fazer

$ find ~ -name __pycache__ -type d -ls -exec rm -rv {} +

a questão é porque find -delete não não funciona.

    
por sds 29.10.2014 / 21:05

2 respostas

33
<%>find -delete % flag funciona de maneira semelhante a rmdir ao excluir diretórios. Se o diretório não estiver vazio quando for alcançado, ele não poderá ser excluído.

Você precisa esvaziar o diretório primeiro. Como você está especificando -type d , find não fará isso por você.

Você pode resolver isso executando dois passos: primeiro, exclua tudo nos diretórios denominados __pycache__ e exclua todos os diretórios denominados __pycache__ :

find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete

Um pouco menos rigorosamente controlado, mas em uma única linha:

find ~ -path '*/__pycache__*' -delete

Isso excluirá qualquer coisa da sua casa que tenha __pycache__ como parte de seu caminho.

    
por 29.10.2014 / 22:23
5

Existem algumas possíveis razões para isso.

1) Você disse para excluir apenas os diretórios ( -type d ), e esses diretórios ainda têm arquivos dentro deles.

2) Seus diretórios contêm apenas outros diretórios, portanto, o -type d cuidará do problema do conteúdo. No entanto, você está usando o OS-X, que é largamente baseado no FreeBSD, e o FreeBSD find por padrão irá processar o diretório antes de seu conteúdo.
No entanto, a opção -depth existe para resolver esse problema dizendo find para processar o diretório após seu conteúdo.

find ~ -name __pycache__ -type d -ls -delete -depth

Esse problema não existe no linux porque a opção -delete habilita implicitamente -depth .

FreeBSD man 1 find :

 -depth  Always true; same as the non-portable -d option. Cause find to
   perform a depth-first traversal, i.e., directories are visited in
   post-order and all entries in a directory will be acted on before
   the directory itself. By default, find visits directories in
   pre-order, i.e., before their contents. Note, the default is not
   a breadth-first traversal.

GNU man 1 find :

 -depth Process each directory's contents before the directory itself. The -delete
        action also implies -depth.
    
por 30.10.2014 / 01:17

Tags