递归更改目录并在每个目录中执行命令

时间:2013-02-21 00:05:49

标签: bash

我正在尝试编写一个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 个答案:

答案 0 :(得分:6)

这里有一些接近的建议,但这里有一个实际有用的建议:

find "$HOME"/gpgn302/lab* -type d -exec bash -c 'cd "$1"; scons -c' -- {} \;

答案 1 :(得分:3)

使用find执行此类任务:

find "$HOME/gpgn302" -name 'lab*' -type d -execdir scons -c . \;

答案 2 :(得分:2)

使用find查找和运行命令很容易。

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

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

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

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

find -name 'a*' -type d -print -exec bash -c 'cd "{}"; scons -c'  \;

答案 3 :(得分: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