Shell Script для запуска команд во всех подкаталогах

Я делаю сценарий, чтобы упростить мои ежедневные задачи. Каждый день я вынужден искать некоторые вещи на сервере компании. Это было нормально, однако, теперь они разделили каждый объект на подкаталоги. Я ищу решение, в котором мой существующий сценарий оболочки будет многократно выполняться в каждом подкаталоге внутри определенного каталога. Как мне это сделать? Я довольно новичок в Ubuntu и все еще изучаю веревки.

Вот мой сценарий:

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

По сути, я хочу запустить этот сценарий для выполнения на всех существующих подкаталогах определенного каталога. Что я делаю? Спасибо!

3
задан 2 August 2012 в 15:44

3 ответа

Это должно более или менее сделать свое дело. Я предполагаю, что каталог 'node0' будет в подкаталогах, если 'sysconfig.out' нет, и что 'his_file' также находится в подкаталогах.

#!/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
0
ответ дан 2 August 2012 в 15:44

Можно выполнить итерации subdirs с для цикла как это

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

Я изменил Ваши власти в awks, который должен быть более портативным. Я полагаю, что они должны произвести тот же вывод. Важные части являются кавычками вокруг путей.

2
ответ дан 2 August 2012 в 15:44

Более простой, хотя и менее элегантный способ перебора подкаталогов заключается в следующем:

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"
0
ответ дан 2 August 2012 в 15:44

Другие вопросы по тегам:

Похожие вопросы: