J'écris un script en bash sur Linux et j'ai besoin de parcourir tous les noms de sous-répertoires dans un répertoire donné. Comment puis-je parcourir ces répertoires (et ignorer les fichiers normaux)?
Par exemple:
le répertoire donné /tmp/
contient les sous-répertoires suivants:/tmp/A, /tmp/B, /tmp/C
Je veux récupérer A, B, C.
Réponses:
Une brève explication:
find
trouve des fichiers (bien évidemment).
est le répertoire actuel, qui après lecd
est/tmp
(à mon humble avis, c'est plus flexible que d'avoir/tmp
directement dans lafind
commande. Vous n'avez qu'un seul endroit, lecd
, à changer, si vous voulez que plus d'actions aient lieu dans ce dossier)-maxdepth 1
et-mindepth 1
assurez-vous quefind
ne regarde que dans le répertoire courant et ne s'inclut pas.
dans le résultat-type d
recherche uniquement les répertoires-printf '%f\n
imprime uniquement le nom du dossier trouvé (plus une nouvelle ligne) pour chaque appel.Et voilà!
la source
while..done
boucle, vous pouvez devenir fou.find
L'-exec
option de vous permet d'exécuter n'importe quelle commande pour chaque fichier / répertoire.Toutes les réponses utilisées jusqu'à présent
find
, alors en voici une avec juste le shell. Pas besoin d'outils externes dans votre cas:la source
find
quand vous pouvez ajouter une barre oblique à un jokerfor dir in */; do echo $dir; done
va de même pour les répertoires du répertoire courant.dir=${dir%*/}
etecho ${dir##*/}
fait./tmp/*/
, il serait sage d'inclure une vérification pour voir si le répertoire existe réellement.Vous pouvez parcourir tous les répertoires, y compris les répertoires cachés (commençant par un point) avec:
remarque: l' utilisation de la liste ne
*/ .*/
fonctionne dans zsh que s'il existe au moins un répertoire caché dans le dossier. En bash, il montrera aussi.
et..
Une autre possibilité pour bash d'inclure des répertoires cachés serait d'utiliser:
Si vous souhaitez exclure les liens symboliques:
Pour afficher uniquement le nom du répertoire de fin (A, B, C comme interrogé) dans chaque solution, utilisez ceci dans les boucles:
Exemple (cela fonctionne également avec les répertoires contenant des espaces):
la source
Fonctionne avec les répertoires contenant des espaces
Inspiré par Sorpigal
Message d'origine (ne fonctionne pas avec les espaces)
Inspiré de Boldewyn : Exemple de boucle avec
find
commande.la source
la source
basename
. Je préférerais cela à ma réponse.La technique que j'utilise le plus souvent est
find | xargs
. Par exemple, si vous souhaitez rendre tous les fichiers de ce répertoire et de tous ses sous-répertoires lisibles par le monde, vous pouvez faire:L'
-print0
option se termine par un caractère NULL au lieu d'un espace. L'-0
option divise son entrée de la même manière. C'est donc la combinaison à utiliser sur les fichiers avec des espaces.Vous pouvez imaginer cette chaîne de commandes comme prenant chaque sortie de ligne
find
et la collant à la fin d'unechmod
commande.Si la commande que vous souhaitez exécuter en tant qu'argument au milieu plutôt qu'à la fin, vous devez être un peu créatif. Par exemple, j'avais besoin de changer dans chaque sous-répertoire et d'exécuter la commande
latemk -c
. J'ai donc utilisé (de Wikipedia ):Cela a pour effet de
for dir $(subdirs); do stuff; done
, mais est sans danger pour les répertoires avec des espaces dans leurs noms. De plus, les appels séparés àstuff
sont effectués dans le même shell, c'est pourquoi dans ma commande nous devons revenir au répertoire courant avecpopd
.la source
une boucle de bash minimale sur laquelle vous pouvez construire (basée sur la réponse de ghostdog74)
pour compresser tout un tas de fichiers par répertoire
la source
directory
, pas seulement les sous-répertoires.find . -type d -maxdepth 1
la source
Si vous souhaitez exécuter plusieurs commandes dans une boucle for, vous pouvez enregistrer le résultat de
find
withmapfile
(bash> = 4) en tant que variable et parcourir le tableau avec${dirlist[@]}
. Il fonctionne également avec des répertoires contenant des espaces.La
find
commande est basée sur la réponse de Boldewyn. Vous trouverez de plus amples informations sur lafind
commande ici.la source