3

我正在尝试编写一个 bash 脚本来递归地遍历一个目录并在每次登陆时执行一个命令。来自基础的每个文件夹都有前缀“lab”,我只想通过这些文件夹进行递归。没有递归遍历文件夹的示例是:

#!/bin/bash

cd $HOME/gpgn302/lab00
scons -c
cd $HOME/gpgn302/lab00/lena
scons -c
cd $HOME/gpgn302/lab01
scons -c
cd $HOME/gpgn302/lab01/cloudpeak
scons -c
cd $HOME/gpgn302/lab01/bear
scons -c

虽然这可行,但如果我想在 lab01 中添加更多目录,我将不得不编辑脚本。先感谢您。

4

4 回答 4

6

这里有一些接近的建议,但这是一个真正有效的建议:

find "$HOME"/gpgn302/lab* -type d -exec bash -c 'cd "$1"; scons -c' -- {} \;
于 2013-02-21T00:27:41.890 回答
3

用于find此类任务:

find "$HOME/gpgn302" -name 'lab*' -type d -execdir scons -c . \;
于 2013-02-21T00:14:04.723 回答
2

它易于使用find来定位和运行命令。

这是一个在运行命令之前更改为正确目录的示例:

find -name 'lab*' -type d -execdir scons -c \;

更新: 根据 thatotherguy 的评论,这不起作用。将find -type d只返回目录名称,但是-execdir命令对包含匹配文件的子目录进行操作,因此在此示例中,该scons -c命令将在找到的lab*目录的父目录中执行。

使用 thatotherguy 的方法或非常相似的方法:

find -name 'a*' -type d -print -exec bash -c 'cd "{}"; scons -c'  \;
于 2013-02-21T00:15:57.860 回答
0

如果你想用 bash 来做:

#!/bin/bash

# set default pattern to `lab` if no arguments
if [ $# -eq 0 ]; then
  pattern=lab
fi

# get the absolute path to this script
if [[ "$0" = /* ]]
then
  script_path=$0
else
  script_path=$(pwd)/$0
fi

for dir in $pattern*; do
  if [ -d $dir ] ; then
    echo "Entering $dir"
    cd $dir > /dev/null
    sh $script_path dummy
    cd - > /dev/null
  fi  
done
于 2013-02-21T00:27:13.340 回答