Il s'agit d'une ligne très simple :
find Parent -empty -delete
C'est assez explicite. Bien que lorsque j'ai vérifié, j'ai été surpris qu'il supprime avec succès Parent/Child1. Habituellement, vous vous attendez à ce qu'il traite le parent avant l'enfant, sauf si vous spécifiez -depth
.
Cela fonctionne car -delete
implique -depth
. Voir le manuel de recherche GNU :
-delete
Supprimer les fichiers; true si la suppression a réussi. Si la suppression a échoué, un message d'erreur est émis. Si -delete échoue, le statut de sortie de find sera différent de zéro (lorsqu'il finira par se terminer). L'utilisation de -delete active automatiquement l'option -depth.
Notez que ces fonctionnalités ne font pas partie du standard Posix, mais qu'elles seront probablement présentes dans de nombreuses distributions Linux. Vous pouvez avoir un problème spécifique avec les plus petits tels que Alpine Linux car ils sont basés sur Busybox qui ne prend pas en charge -empty
.
Autres systèmes qui incluent -empty
non standard et -delete
inclure BSD et OSX mais apparemment pas AIX.
Voici une solution à deux commandes
Supprimer les fichiers vides
find Parent/ -type f -size 0 -delete
Essayez de supprimer tous répertoires
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
NB rmdir
ne peut pas supprimer les répertoires non vides, il est donc sûr de l'exécuter mais produira des erreurs, que nous cachons
Comme ci-dessus, mais en étant un peu plus précis sur les messages d'erreur ignorés. Il peut être nécessaire de modifier si le message varie d'une distribution à l'autre.
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
| grep -iv "Directory not empty$"
Vous pouvez également le faire avec le fd
outil :
fd -t e -x rm -r
https://github.com/sharkdp/fd