Como esse comando funciona para que o diretório pai seja excluído depois que seus subdiretórios forem excluídos?

2

De link

find . -type d -depth -empty -exec rmdir "{}" \;

That will first drill down the directory tree until it finds the first empty directory, then delete it. Thus making the parent directory empty which will then be deleted, etc. This will produce the desired effect (I do this probably 10 times a week, so I'm pretty sure it's right). :-)

Como funciona para que o diretório pai seja excluído depois que seus subdiretórios forem excluídos?

Obrigado.

    
por Tim 08.12.2017 / 16:52

1 resposta

8

Na find manpage :

-depth Process each directory’s contents before the directory itself. The -delete action also implies -depth.

com

find . -type d -depth -empty -exec rmdir "{}" \;

find inicia no diretório atual e procura por todos os arquivos e diretórios contidos nele (e em crianças, etc.); Em seguida, ele processa cada um, começando com o conteúdo de um diretório antes de processar o diretório pai. Imagine a seguinte árvore:

.
├── a
│   ├── c
│   └── d
│       └── e
└── b

find . -depth mostra a ordem em que isso será processado:

./a/c
./a/d/e
./a/d
./a
./b
.

Como você pode ver, as crianças são listadas antes dos pais. Em um comando find mais complexo, as ações seriam aplicadas às crianças antes dos pais; no exemplo fornecido, os diretórios de folha vazia serão processados primeiro e, se estiverem vazios, excluídos; então seus pais serão processados e, por sua vez, se eles estiverem vazios (o que pode ser o caso, já que seus filhos vazios foram excluídos), excluídos também, e assim por diante. diretório.

Se você omitir -depth , find processará arquivos na ordem de enumeração, por exemplo

.
./a
./a/c
./a/d
./a/d/e
./b

Portanto, . é processado primeiro; não está vazio, então é deixado em paz. Então a , e o mesmo se aplica. Então a/c ; que é excluído porque está vazio. a/d é deixado sozinho, a/d/e é excluído, assim como b . Mas find não revisita os diretórios que já foram processados, então a e a/d permanecem, mesmo que desejemos que eles sejam excluídos.

    
por 08.12.2017 / 16:57

Tags