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: p> et j'ai besoin de, dans un script Bash, appelez: p> ou alternativement, Espaces évasés: p> J'ai besoin que le script soit appelé exactement une fois pour "Stuff". P> 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. p> p>
4 Réponses :
Vous pouvez utiliser la commande script.py $(find /stuff/* -type d | while read line; do echo "\"$line"\"; done)
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?
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[@]}"
Gardez à l'esprit que la recherche va recueillira dans des répertoires. Vous avez besoin de -MaxDepth 1 code>. En outre,
-exec script.py {} + code> 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 code> 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 code> dans
homme trouvent code>) et la possibilité de
exécuté code> .. 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 code>, c'est tout.
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.
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.
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