Comment puis-je obtenir une liste de répertoires dans bash et puis développez comme des paramètres de ligne de commande?
Je suis en train d'écrire un script bash qui doit, pour une étape, d'obtenir une liste de répertoires (variable) dans un répertoire cible (qui peut également contenir des fichiers), puis les étendre comme des paramètres à un script python.
Exemple:
/stuff/a dir/
/stuff/b other/
/stuff/c/
Et j'en ai besoin dans un script bash, composez le:
script.py "a dir/" "b other/" "c/"
ou en alternance, échappé des espaces:
script.py a\ dir/ b\ other/ c/
J'ai besoin que le script sera appelé exactement une fois pour le répertoire "trucs".
Est-il un moyen simple pour faire ce genre de chose? J'ai cherché sur google et le meilleur que j'ai réussi à comprendre exige de moi de savoir comment de nombreux répertoires.
OriginalL'auteur Charles Randall | 2011-06-24
Vous devez vous connecter pour publier un commentaire.
C'est un travail pour les trouver.
Lorsque vous utilisez
-exec
les accolades{}
sont remplacés par les noms de fichiers correspondants, et+
indique la fin de la commande (dans le cas où vous voulez dire trouver à prendre des mesures additionnelles). C'est le moyen idéal pour exécuter une commande à l'aide de la recherche, car il sera de gérer les noms de fichiers avec des caractères spéciaux (tels que les espaces) correctement.trouver est assez flexible, surtout si vous avez la version GNU généralement livré avec des distributions Linux.
Dans le deuxième exemple, l'avis de la prudence dans l'utilisation de
\0
etxargs -0
utiliser le caractère NUL de délimiter les noms de fichier. Il peut sembler bizarre mais cela permet à la commande de travail, même si vous faites quelque chose de vraiment bizarre comme utiliser des retours à la ligne\n
dans votre répertoire de noms.Alternativement, vous pouvez faire cela en utilisant uniquement shell objets internes. Je ne le recommande pas, mais pour une valeur éducative, voici comment:
-maxdepth 1
. Aussi,-exec script.py {} +
pourrait peut-être appeler le script plusieurs fois, si il y a beaucoup de répertoires. Il n'est pas clair à partir de la question de savoir si c'est ok.clarifier ma question.
Légèrement hors sujet, mais pourquoi vous recommandons pas de le faire juste avec shell objets internes?
Randall: Re builtin' vs 'pas-builtin' ..
find
a autant de fonctionnalités utiles pour traiter avec les fichiers; moreso que les "objets internes" de par exemple. lorsque vous traitez avec un espace intégré les noms de fichiers (voir-print0
dansman find
), et la capacité deexec
.. pour plus d'info sur le comment/quoi/pourquoi des objets internes, voir: unix.stackexchange.com/questions/11454/...Je ne veux pas laisser entendre que le bash-seulement script est mauvais. Il est parfaitement bon code et ne présente pas de défauts, que je sache. C'est juste plus de commentaires que d'utiliser
find
, c'est tout.OriginalL'auteur John Kugelman
Une solution plus simple qui ne prend pas en créer un nouveau processus (comme trouver t) est:
OriginalL'auteur drwho
Vous pouvez utiliser le trouver de commande et dire qu'à imprimer les répertoires avec -type d. Votre commande devrait ressembler à ceci:
Si vous êtes inquiet au sujet des espaces et autres caractères spéciaux, vous pouvez le faire:
J'ai mis à jour la réponse à l'inclure.
OriginalL'auteur Corey Henderson
Cela permettra de trouver tous les répertoires sous /trucs, mais pas de manière récursive et de les transmettre à script.py et assurez-vous qu'ils sont passés correctement même si il y a des espaces dans les noms de répertoire.
Mis à jour en fonction de votre commentaire.
OriginalL'auteur Steve Prentice