Shell Script para Executar Comandos para Todos os Subdiretórios

3

Estou fazendo um script para simplificar minhas tarefas diárias. Todos os dias, tenho que procurar algumas coisas dentro de um servidor da empresa. Tudo bem, no entanto, agora, eles segregaram cada objeto em sub-diretórios. Eu estou procurando uma solução na qual meu script de shell existente será executado repetidamente em cada sub diretório dentro de um determinado diretório. Como eu faço isso? Eu sou muito novo no Ubuntu e ainda estou aprendendo as coisas.

Aqui está meu 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

Basicamente eu quero rodar este script para executar todos os subdiretórios existentes de um determinado diretório. O que eu faço? Obrigado!

    
por JudeJitsu 02.08.2012 / 11:51

3 respostas

0

Isso deve mais ou menos fazer o truque. Estou assumindo que o diretório 'node0' estará dentro dos subdiretórios se 'sysconfig.out' não estiver e que 'his_file' também está nos subdiretórios.

#!/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
    
por Mark Paskal 02.08.2012 / 12:21
2

Você pode iterar subdiretórios com um loop for como este

#!/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

Eu mudei seus greps em awks que deveriam ser mais portáteis. Eu acredito que eles deveriam produzir a mesma saída. As partes importantes são as citações em torno dos caminhos.

    
por geirha 02.08.2012 / 18:06
2

Uma maneira mais fácil, embora menos elegante, de iterar subdiretórios é esta:

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"
    
por Scott Severance 03.08.2012 / 01:58

Tags