3 votes

Shell Shell pour exécuter des commandes à tous les sous-répertoires.

Je fais un script pour simplifier mes tâches quotidiennes. Tous les jours, je dois rechercher par grep quelques éléments sur le serveur d'une entreprise. C'était correct, cependant, maintenant, ils ont séparé chaque objet dans des sous-répertoires. Je cherche une solution dans laquelle mon script script existant s'exécutera de manière répétée dans chaque sous-répertoire à l'intérieur d'un certain répertoire. Comment puis-je faire cela ? Je suis assez nouveau sur Ubuntu et j'apprends encore les ficelles du métier.

Voici mon script :

#!/bin/bash

#fetch start time of uut
grep -i "01_node_setup" his_file | tail -1 >> /home/xtee/sst-logs.out

#check if sysconfig.out exists
if [ -f sysconfig.out];
then
    grep -A 1 "Drive Model" sysconfig.out | tail -1 >> /home/xtee/sst-logs.out
else
    grep -m 1 "Pair0 DIMM0" node0/trans_file_prev/*setupsys* | tail -1 >> /home/xtee/sst-logs.out
fi

En gros, je veux lancer ce script pour qu'il s'exécute sur tous les sous-répertoires existants d'un certain répertoire. Que dois-je faire ? Merci !

2voto

Steve Karg Points 11

Vous pouvez itérer les sous-répertoires avec un for-loop comme ceci

#!/usr/bin/env bash

for dir in /the/path/*/; do
    awk 'tolower($0) ~ /01_node_setup/{line=$0} END{print line}' "$dir/his_file"

    if [[ -f "$dir/sysconfig.out" ]]; then
        awk '/Drive Model/{getline line} END{print line}' "$dir/sysconfig.out"
    else
        awk '/Pair0 DIMM0/{print;exit}' "$dir/node0/trans_file_prev"/*setupsys*
    fi
done >> /home/xtee/sst-logs.out

J'ai changé vos greps en awks qui devraient être plus portables. Je pense qu'ils devraient produire la même sortie. Les parties importantes sont les guillemets autour des chemins.

2voto

Scott Severance Points 13166

Une façon plus simple, bien que moins élégante, d'itérer les sous-répertoires est la suivante :

base="/something"

iterator() {
  local dir="$1"
  local i=
  for i in "$dir"/*; do
    if [[ -d "$i" ]]; then
      iterator "$dir/$i"
    else
      # do something with this file
    fi
  done
}

iterator "$base"

0voto

Mark Paskal Points 2842

Cela devrait plus ou moins faire l'affaire. Je suppose que le répertoire 'node0' sera dans les sous-répertoires si 'sysconfig.out' ne l'est pas et que 'his_file' est aussi dans les sous-répertoires.

#!/bin/bash
MainDir=/path/to/dir/containing/subdirs
# cd into dir
cd $MainDir

for dir in *; do

#fetch start time of uut
grep -i "01_node_setup" $dir/his_file | tail -1 >> /home/xtee/sst-logs.out

#check if sysconfig.out exists
if [ -f $dir/sysconfig.out];
then
    grep -A 1 "Drive Model" $dir/sysconfig.out | tail -1 >> /home/xtee/sst-logs.out
else
    grep -m 1 "Pair0 DIMM0" $dir/node0/trans_file_prev/*setupsys* | tail -1 >> /home/xtee/sst-logs.out
fi

done

#cd back to where we started
cd $OLDPWD

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X