J'ai besoin de trouver des répertoires vides pour une liste donnée de répertoires. Certains répertoires contiennent des répertoires.
Si les répertoires internes sont également vides, je peux dire que le répertoire principal est vide, sinon il n'est pas vide.
Comment puis-je tester cela?
Par exemple:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Réponses:
Vérifiez si
find <dir> -type f
quelque chose sort. Voici un exemple:la source
-type f
sert.mkdir A B C A/A1 A/A2 B/B1 C/C1 C/C2; touch A/A1/file1
- et exécute le code dans ma réponse, il signale que B et C sont vides, comme requis par l'OP. Vous devrez donc être un peu plus précis que «cela ne fonctionnera pas».Cela dépend un peu de ce que vous voulez faire avec les répertoires vides. J'utilise la commande ci-dessous lorsque je souhaite supprimer tous les répertoires vides dans une arborescence, par exemple
test
répertoire.Une chose à noter à propos de la commande ci-dessus est qu'elle supprimera également les fichiers vides , utilisez donc l' option -type d pour éviter cela.
Déposez
-delete
pour voir les fichiers et répertoires correspondants.Si votre définition d'une arborescence de répertoires vide est qu'elle ne contient aucun fichier, vous pouvez alors coller quelque chose ensemble en fonction du
find test -type f
retour ou non.find
est un excellent utilitaire, et RTFM tôt et souvent pour vraiment comprendre tout ce qu'il peut faire :-)la source
-empty
, si pratique!find test -name ".DS_Store" -delete
abord, puis la-empty delete
commande. Notez également, comme pourpushd
le répertoire parent, ce quifind test
devientfind .
, mais le reste des commandes sont les mêmes.-depth
ici, c.-à-d. Cause find pour effectuer une traversée en profondeur d'abord, c'est-à-dire que les répertoires sont visités dans l'ordre postérieur et que toutes les entrées d'un répertoire agiront avant le répertoire lui-même. Je pense que c'est pertinent ici.Vous pouvez utiliser la commande suivante:
la source
C'est la version que j'ai trouvée la plus intéressante. S'il est exécuté depuis l'intérieur du répertoire , il supprimera tous les répertoires vides ci-dessous (un répertoire est considéré comme vide s'il ne contient que des répertoires vides).
L'option mindepth empêche le répertoire lui-même d'être supprimé s'il est vide.
la source
rmdir --ignore-fail-on-non-empty -p directory
pour vous débarrasser des parents.find . -type d -empty
trouve et répertorie les répertoires et sous-répertoires vides dans l'arborescence actuelle. Par exemple, la liste résultante de répertoires et sous-répertoires vides:
Aucune opération n'est effectuée sur les répertoires. Ils sont simplement listés. Cela fonctionne pour moi.
la source
Il suffit de trouver des répertoires vides
Afin de ne trouver que les répertoires vides (comme spécifié dans le titre de la question), la réponse du mosg est correcte:
Mais
-empty
peut ne pas être disponible sur desfind
versions très anciennes (c'est le cas de HP-UX par exemple). Si tel est votre cas, consultez les techniques décrites dans la section ci-dessous Un répertoire est-il vide? .Supprimer les répertoires vides
C'est un peu délicat: supposons qu'un répertoire
MyDir
contienne des répertoires vides. Après avoir supprimé ces répertoires vides,MyDir
deviendra un répertoire vide et devrait également être supprimé. Par conséquent, j'utilise la commandermdir
avec l'option--parents
(ou-p
) qui supprime également les répertoires parents lorsque cela est possible:Sur les anciennes
find
versions, l'instruction+
n'est pas encore prise en charge, vous pouvez donc utiliser à la;
place:Un répertoire est-il vide?
La plupart de ces réponses expliquent comment vérifier si un répertoire est vide. Par conséquent, je propose ici les trois techniques différentes que je connais:
[ $(find your/dir -prune -empty) = your/dir ]
une variante:
Explication:
find -prune
est similaire à l'find -maxdepth 0
utilisation de moins de caractèresfind -type d
imprime uniquement les répertoiresfind -empty
imprime les répertoires et fichiers vides(( ${#files} ))
Cette astuce est à 100%
bash
mais invoque (génère) un sous-shell. L'idée est de Bruno De Fraine et améliorée par le commentaire de teambob . Je conseille celui-ci si vous utilisezfrapper et si votre script n'a pas besoin d'être portable.Note: pas de différence entre un répertoire vide et un répertoire inexistant (et même lorsque le chemin fourni est un fichier).
[ $(ls -A your/dir) ]
Cette astuce est inspirée de l'article de nixCraft publié en 2007. Andrew Taylor a répondu en 2008 et gr8can8dian en 2011.
ou la version bashisme en une ligne:
Remarque:
ls
retourne$?=2
lorsque le répertoire n'existe pas. Mais aucune différence entre un fichier et un répertoire vide.la source
rmdir -vp
m'a énormément aidé car je devais non seulement supprimer tous les répertoires vides sous une racine, mais vérifier les répertoires vides et les répertoires parents après la suppression d'un fichier. Dans ma situation, les répertoires vides conviennent tant qu'ils ne sont pas dans l'arborescence dont je supprime actuellement un fichier. Merci!Cette fonction récursive semble faire l'affaire:
Compte tenu de cet exemple de structure de répertoire:
Le résultat de l'exécution de cette fonction serait:
qui manque
/dir4/dirD
. Si vous déplacez l'appel récursiffindempty "$dir"
après lefi
, la fonction inclura ce répertoire dans ses résultats.la source
Et pourquoi pas
rmdir *
? Cette commande échouera sur les répertoires non vides.la source
rmdir */*/* */* *
Bien que cela ne gère pas les «fichiers à points», mais dans des situations manuelles (nettoyage de fichiers de données), vous ne vous attendez généralement pas à des «fichiers à points». Cependant, les méthodes récursives sont destinées à un nettoyage général plus automatisé, en particulier dans les très grandes structures de répertoires.La commande suivante renvoie 1 si un répertoire est vide (ou n'existe pas) et 0 sinon (il est donc possible d'inverser le code de retour avec
!
dans un script shell):la source
J'ai créé une structure simple comme suit:
Le
test/test3/file
contient du texte indésirable.L'émission
find test -empty
renvoie "test/test2/test2.2
" comme seul répertoire vide.la source
une approche simple serait,
aussi,
la source
la source