J'ai un script appelé Summarize.sh qui produit un résumé du fichier / DIRS à l'intérieur d'un répertoire. Je voudrais le faire courir de manière récursive dans l'arbre entier du haut. Quel est un bon moyen de faire cela?
J'ai essayé de la boucler avec une boucle pour p> Cependant, il revient ./summarize.sh: Aucun fichier ou répertoire
Est-ce parce que je ne déplace pas le script comme je l'exécute? Je ne connais pas très bien les annuaires Unix. P> p>
3 Réponses :
Vous pouvez répertorier récursivement des fichiers à l'aide de Si vous voulez des annuaires uniquement, utilisez option supplémentaire par nom, par exemple. Enfin, si vous ne souhaitez pas recueillir la structure de répertoire, c'est-à-dire que vous ne résumez que le niveau supérieur, vous pouvez utiliser l'option trouver. -Type f code> et faites votre script Prenez le fichier intéressé comme premier argument, vous pouvez donc faire
trouver. -Type f -exec myscript.sh {} \; code> p>
trouver. -Type d code> à la place ou si vous voulez utiliser les deux simplement
trouver. code> sans restriction. p>
trouver. -Name '* .py' code> p>
-MAXDEPTH 1 code>, alors quelque chose comme
trouver. -Type D -maxDepth 1 -exec myscript.sh {} \; code>. p>
Le problème est que vous changez vers un répertoire différent avec la commande code> CD code> pendant que votre script Summarize.sh n'est pas situé dans ces répertoires. Une solution possible consiste à utiliser un chemin absolu au lieu d'un relatif. Par exemple, changez: à quelque chose comme: p> alternativement, sous le code donné, vous pouvez également utiliser un chemin relatif. pointant vers le répertoire précédent comme celui-ci: p>
Essayez ce code si vous utilisez Bash 4.0 ou version ultérieure:
#! /bin/bash -p shopt -s nullglob # Globs expand to nothing when they match nothing shopt -s globstar # Enable ** to expand over the directory hierarchy summarizer_path=$PWD/summarize.sh for dir in **/ ; do cd -- "$dir" "$summarizer_path" cd - >/dev/null done
shopt -s nullglob code> évite une erreur au cas où il n'y a pas de répertoires sous le courant actuel. Li>
- La variable
sommarider_path code> est définie sur un chemin absolu pour le programme sommarisé.sh code>. Cela est nécessaire pour lui permettre d'être exécuté dans des annuaires autres que l'actuel. ( ./ sommariser.sh code> ne fonctionne que dans le répertoire actuel, . code>.) li>
- Utilisez
CD - ... code> pour éviter les problèmes si un nom de répertoire commence par '-'. Li>
-
CD -> / dev / null code> à CD code> dans le répertoire précédent et jetez son chemin lors de la sortie par CD - code> . li>
- Shellcheck Problème plusieurs avertissements sur le code ci-dessus, tout à faire avec l'utilisation de
CD code>. Je les réparerais pour "Real" Code. Li>
ul> p>
Il renvoie une erreur /summarize.sh: aucun fichier ou répertoire de ce type code> pour chaque répertoire, il a essayé d'exécuter
@LLSSFFF, Vérifier les erreurs de frappe sur le sommarizer_path = $ pwd / sommarisé.sh code> ligne. PWD variable intégrée à bash contient toujours le chemin absolu du répertoire actuel. Il ne devrait jamais être indéfini ou vide.
Comment accéder à chaque répertoire et exécuter une commande? , Effectuer une action dans chaque sous-répertoire à l'aide de bash , Comment entrer tous les sous-répertoires et exécuter la commande sur Fichiers à l'intérieur? , Exécuter un script de chaque répertoire de Ubuntu Linux , etc.
Dans chaque cas où vous voulez faire quelque chose sur le contenu de chaque répertoire à partir de chaque autre point dans le système de fichiers, vous utiliserez normalement
Recherche / chemin / démarrage / Start -Type D -exec CertainUtility '{}' \; code > Lorsque chaque répertoire est transmis au script
de la queuilité code> pour un traitement ultérieur.