10
votes

Comment trouver une liste de répertoires à Bash puis-je développer en tant que paramètres de ligne de commande?

J'écris un script Bash qui doit, pour une étape, obtenir une liste de répertoires (variable) dans un répertoire cible (qui peut également contenir des fichiers), puis les développer en tant que paramètres sur un script Python.

Exemple: xxx

et j'ai besoin de, dans un script Bash, appelez: xxx

ou alternativement, Espaces évasés: xxx

J'ai besoin que le script soit appelé exactement une fois pour "Stuff".

Y a-t-il un moyen simple de faire ce genre de chose? J'ai été googling et le meilleur que j'ai réussi à comprendre nécessite que je sache combien de répertoires il y a.


0 commentaires

4 Réponses :


2
votes

Vous pouvez utiliser la commande trouver forte> et le dire de imprimer uniquement les répertoires avec -Type d forte>. Votre commande ressemblera à ceci:

script.py $(find /stuff/* -type d | while read line; do echo "\"$line"\"; done)


1 commentaires

Existe-t-il un moyen d'envelopper les sorties individuelles dans des guillemets afin qu'il gère correctement les espaces dans les noms de répertoire?



18
votes

Ceci est un travail pour trouver.

# Start with an empty array.
DIRS=()

# For each file in /stuff/...
for FILE in /stuff/*; do
    # If the file is a directory add it to the array. ("&&" is shorthand for
    # if/then.)
    [[ -d $FILE ]] && DIRS+=("$FILE")

    # (Normally variable expansions should have double quotes to preserve
    # whitespace; thanks to bash magic we don't them inside double brackets.
    # [[ ]] has special parsing rules.)
done

# Pass directories to script. The `"${array[@]}"` syntax is an unfortunately
# verbose way of expanding an array into separate strings. The double quotes
# and the `[@]` ensure that whitespace is preserved correctly.
script.py "${DIRS[@]}"


4 commentaires

Gardez à l'esprit que la recherche va recueillira dans des répertoires. Vous avez besoin de -MaxDepth 1 . En outre, -exec script.py {} + pourrait éventuellement appeler script plusieurs fois, s'il y a de nombreux répertoires. Il n'est pas clair de la question si c'est correct.


Un peu de sujet, mais pourquoi ne recommanderiez-vous pas simplement le faire avec Shell Construits?


@CHARLES RANDALL: RE 'Construit "VS' non intégré" .. Trouver possède des fonctionnalités particulièrement utiles pour traiter des fichiers; Moréso que les "comités", par exemple. Lors de la gestion des noms de fichiers embarqués par l'espace (voir -Print0 dans homme trouvent ) et la possibilité de exécuté .. Pour plus d'informations sur la façon / pourquoi / pourquoi de Constrations, voir: unix.stackexchange.com/questions/11454/...


@Chals je ne voulais pas dire que le script bash-seul est mauvais. C'est parfaitement bon code et n'a pas de défauts que je connais. C'est juste plus verbose que d'utiliser trouver , c'est tout.



1
votes
find /stuff/* -type d -maxdepth 1 -print0 | xargs -0 script.py
This will find all the directories under /stuff, but not recursively and pass them to script.py and make sure they are passed correctly even if there are spaces in the directory names.

3 commentaires

Cela fonctionne presque, sauf qu'il lise également / trucs dans la sortie, ce qui me ferait des problèmes.


Mis à jour basé sur votre commentaire.


Cela recouvre dans le subdir. En utilisant -Mindepth 1 avec MaxDepth 1 sans le * imprime uniquement les répertoires immédiats.



6
votes

Une solution plus simple qui ne crée pas de nouveau processus (comme la recherche le fait) est la suivante:

for f in stuff/*; do
  if [ -d "$f" ]; then
     ./script.py "$f"
  fi
done


0 commentaires