0
votes

Exécuter le script sur chaque niveau de répertoire

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 xxx

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.


2 commentaires

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 '{}' \; Lorsque chaque répertoire est transmis au script de la queuilité pour un traitement ultérieur.


3 Réponses :


1
votes

Vous pouvez répertorier récursivement des fichiers à l'aide de trouver. -Type f et faites votre script Prenez le fichier intéressé comme premier argument, vous pouvez donc faire trouver. -Type f -exec myscript.sh {} \;

Si vous voulez des annuaires uniquement, utilisez trouver. -Type d à la place ou si vous voulez utiliser les deux simplement trouver. sans restriction.

option supplémentaire par nom, par exemple. trouver. -Name '* .py'

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 -MAXDEPTH 1 , alors quelque chose comme trouver. -Type D -maxDepth 1 -exec myscript.sh {} \; .


0 commentaires

1
votes

Le problème est que vous changez vers un répertoire différent avec la commande CD 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: xxx

à quelque chose comme: xxx

alternativement, sous le code donné, vous pouvez également utiliser un chemin relatif. pointant vers le répertoire précédent comme celui-ci: xxx


0 commentaires

0
votes

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>


2 commentaires

Il renvoie une erreur /summarize.sh: aucun fichier ou répertoire de ce type pour chaque répertoire, il a essayé d'exécuter


@LLSSFFF, Vérifier les erreurs de frappe sur le sommarizer_path = $ pwd / sommarisé.sh 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.