web-dev-qa-db-fra.com

Supprimer les sous-dossiers vides, conserver le dossier parent

Quand j'utilise

find /home/user/parentdir -type d -empty -delete

il recherche récursivement des sous-dossiers vides dans /home/user/parentdir et les supprime. Mais si /home/user/parentdir est également vide, il supprime également le dossier parentdir, ce qui n'est pas souhaitable pour moi.

Je veux conserver ce parentdir à rsync certains fichiers à sauvegarder ou à cloud. Après le traitement, je dois supprimer les dossiers vides, mais il semble improductif de recréer parentdir à chaque fois.

Des suggestions pour conserver parentdir? J'ai pensé à créer un .nocopy fichier à l'intérieur et l'exclure de rsync, mais ressemble à exagéré. Existe-t-il une manière plus élégante?

15
TNT

Faites simplement find /home/user/parentdir -mindepth 1 -type d -empty -delete.

Regardez:

$ mkdir -p test1/test2
$ find test1 -type d
test1
test1/test2
$ find test1 -mindepth 1  -type d
test1/test2

Le find /home/user/parentdir/*dans la réponse d'AmourK n'est pas souhaitable quand il y a beaucoup de fichiers et qu'il est trop compliqué.

25
chx

En ajoutant /* à la fin de parentdir, vous effectuez l'action sur tous les sous-répertoires de parentdir plutôt que sur parentdir lui-même. Et donc de la même manière /home/user/ n'est pas supprimé dans l'ancienne commande, parentdir ne sera pas supprimé dans la commande ci-dessous. * est appelé un opérateur glob et correspond à n'importe quelle chaîne de caractères.

find /home/user/parentdir/* -type d -empty -delete

15
AmourK

si vous avez installé php-cli,

printf %s $(pwd) | php -r 'function f(string $dir){var_dump($dir);$dir.=DIRECTORY_SEPARATOR;foreach(glob("$dir*",GLOB_ONLYDIR) as $d){f($d);}global $original;if(substr($dir,0,-strlen(DIRECTORY_SEPARATOR))!==$original && empty(glob("$dir*"))){rmdir($dir);}}f(($original=stream_get_contents(STDIN)));'
0
hanshenrik

Lorsque vous n'avez besoin que d'un seul niveau (quitter un dossier parent, mais supprimer des dossiers enfants vides), une astuce simple consiste à utiliser rmdir.

rmdir parent/*

Supprime tous les sous-dossiers vides, mais n'imprime qu'une erreur pour les fichiers et les dossiers non vides.

Cela ne fonctionne pas récursivement, mais lorsque vous connaissez la structure de votre dossier, cela peut être le moyen le plus rapide de faire quelque chose comme

rmdir parent/*/*/* # deletes parent/a/b/c when empty
rmdir parent/*/* # deletes parent/a/b when it is now empty
rmdir parent/* # deletes parent/a when it is now empty

Avantage: facile à mémoriser, rapide à taper, peu de potentiel pour choisir un mauvais paramètre.
Inconvénient: moins flexible, peut-être beaucoup de messages d'erreur dans votre terminal.

0
allo