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 に答える