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?
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é.
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
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)));'
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.