2

ディレクトリとそのサブディレクトリなどで、特定の正規表現に一致するファイルを検索するスクリプトを作成しようとしています。そこで、最初にディレクトリとサブディレクトリを取得する関数を作成することから始めました。何らかの理由で、現在、指定されたディレクトリの最初のサブディレクトリのみを取得しているようです。

関数は次のとおりです。

getDirs() {

cd "$1"
for i in *; do
    if [ -d "$i" ]; then
        echo "dir: $PWD/$i"
        getDirs "$i"
    fi
done
}

getDirs $path

これを修正する方法はありますか?

4

3 に答える 3

2

ファイル名を検索するための正規表現が必要な場合は、を使用してこれを実行してみてください。

regex="YourRegexPattern"
find "$1" -type f -regextype posix-egrep -regex "$regex"

すべてのdirs/subdirsを取得したい場合:

find . -type d
于 2012-12-02T18:24:25.277 に答える
1

これでうまくいくはずですが、findより効率的です。

getDirs() {
    for i in "$1"/*; do
        if [ -d "$i" ]; then
            echo "$i"
            getDirs "$i"
        fi
    done
}
于 2012-12-02T18:35:19.237 に答える
0

確かに、それはループの後で前のディレクトリに戻らないからです。したがって、すべてをサブシェルに入れることができます。

getDirs() {
    (
    cd "$1"
    for i in *; do
        if [[ -d "$i" ]]; then
            echo "dir: $PWD/$i"
            getDirs "$i"
        fi
    done
    )
}

getDirs $path

cdまたは、ループの後に現在のディレクトリを保存します。

getDirs() {
    local currentdir=$PWD
    cd "$1"
    for i in *; do
        if [[ -d "$i" ]]; then
            echo "dir: $PWD/$i"
            getDirs "$i"
        fi
    done
    cd "$currentdir"
}

getDirs $path

または他の...私はあなたが今あなたの間違いがどこにあったかを見ると思います!

cdまた、たとえば、で作業したことを確認する必要がありますcd "$1" || <do something as the cd failed>

于 2012-12-02T18:41:58.150 に答える