Quand j'utilise
find /home/user/parentdir -type d -empty -delete
il recherche récursivement les sous-dossiers vides à l'intérieur /home/user/parentdir
et les supprime. Mais s'il /home/user/parentdir
est également vide, il supprime également le parentdir
dossier, ce qui n'est pas souhaitable pour moi.
Je souhaite conserver cela parentdir
dans rsync
certains fichiers à sauvegarder ou dans le cloud. Après le traitement, je dois supprimer les dossiers vides, mais semble improductif à recréer à parentdir
chaque fois.
Des suggestions à garder parentdir
? J'ai pensé à créer un .nocopy
fichier à l'intérieur et à l'exclure rsync
, mais cela semble exagéré. Existe-t-il une manière plus élégante?
-mindepth 1
?Réponses:
Faites-le simplement
find /home/user/parentdir -mindepth 1 -type d -empty -delete
.Regardez:
La
find /home/user/parentdir/*
réponse d'AmourK n'est pas souhaitable lorsqu'il y a beaucoup de fichiers et qu'elle est trop compliquée.la source
En ajoutant
/*
à la fin deparentdir
, vous effectuez l'action sur tous les sous-répertoires de parentdir plutôt que surparentdir
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 il correspond à n'importe quelle chaîne de caractères.find /home/user/parentdir/* -type d -empty -delete
la source
/home/user/parentdir/
, le glob étendu peut dépasserARG_MAX
, ce qui entraîne une liste d'arguments trop longue . Vous pouvez réduire le risque que cela se produise en modifiant le glob pour*/
qu'il corresponde uniquement aux répertoires./tmp
, de créer un sous-répertoire, de décompresser une archive tar compressée, d'exécuter le programme d'installation et de nettoyer. Le débutant pensait querm -rf /tmp/foo-install
c'était la bonne façon de le faire, et comme la main expérimentée a dit "Noooooo" dans sa meilleure impression de Dark-Vader-à-la-fin-de-l'épisode-III, le newb a découvert à la dure à quel point le / et les touches Entrée étaient l'une pour l'autre. Nous avons dû démarrer à partir du disque de restauration du logiciel de sauvegarde et recharger l'ensemble du serveur à partir de la bande.si vous avez installé php-cli,
la source
foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());
ou quelque chose de proche.$skipped
s'occupe de sauter le premier,@rmdir
essaie de supprimer un répertoire et silencieusement (c'est le @) échoue s'il n'est pas vide.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
.Supprime tous les sous-dossiers vides, mais imprime uniquement 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
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.
la source