我正在尝试编写一个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中添加更多目录,我将不得不编辑脚本。提前谢谢。
答案 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