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.