对所有子目录运行命令的 Shell 脚本

对所有子目录运行命令的 Shell 脚本

我正在编写一个脚本来简化我的日常任务。每天,我都必须在公司服务器中 grep 一些东西。这没问题,但是现在,他们已将每个对象隔离到子目录中。我正在寻找一种解决方案,使我现有的 shell 脚本可以在某个目录内的每个子目录中重复执行。我该怎么做?我对 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

基本上,我想运行此脚本来执行某个目录下的所有现有子目录。我该怎么做?谢谢!

答案1

您可以使用这样的 for 循环迭代子目录

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

我将您的 greps 改成了 awks,这样应该更易于移植。我相信它们应该会产生相同的输出。重要的部分是路径周围的引号。

答案2

迭代子目录的一种更简单但不太优雅的方法是:

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"

答案3

这或多或少应该能解决问题。我假设如果“sysconfig.out”不在子目录中,则“node0”目录将位于子目录中,并且“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

相关内容