0

名前のリストを反復処理する再帰スクリプトを取得しました。その一部はファイルで、一部はディレクトリです。

(空ではない) ディレクトリの場合は、ディレクトリ内のすべてのファイルを使用してスクリプトを再度呼び出し、それらが正当かどうかを確認する必要があります。

再帰呼び出しを行うコードの部分:

if [[ -d $var ]] ; then
    if [ "$(ls -A $var)" ]; then 
        ./validate `ls $var`
    fi
fi

ファイルが合法かどうかをチェックするコードの部分:

if [[ -f $var ]]; then
    some code
fi

しかし、再帰呼び出しを行った後、メイン スクリプトと同じディレクトリにないため、そのディレクトリ内のファイルを確認できなくなり-f $varました。

どうすればそれらを引き続き表示して使用できるかについての提案はありますか?

4

4 に答える 4

2

常に変数を引用符で囲みます。スペースを含むファイルまたはディレクトリ名がいつ見つかるかはわかりません

shopt -s nullglob
if [[ -d "$path" ]] ; then
    contents=( "$path"/* )
    if (( ${#contents[@]} > 0 )); then 
        "$0" "${contents[@]}"
    fi
fi
  • あなたは再発明していますfind
  • もちろん、varお粗末な変数名です
  • スクリプトを再帰的に呼び出す場合は、スクリプト名をハードコードする必要はありません。
    • ロジックをスクリプト内の関数に入れることを検討する必要があります。関数は、シェル スクリプトを呼び出すたびに新しいプロセスを生成する代わりに、再帰的に自分自身を呼び出すことができます。これを行う場合は、$FUNCNAME代わりに使用します"$0"
于 2013-05-25T16:28:38.563 に答える
2

数人がfindこの問題を解決する方法について言及していますが、私はそれがどのように行われるかを示したかっただけです:

find /yourdirectory -type f -exec ./validate {} +; 

yourdirectoryこれにより、そのすべてのサブディレクトリ内のすべての通常のファイルが再帰的に検索され、それらのパスが引数として に返されます./validate。は、内{}にあるファイルのパスに展開されます。最後のは、検証の各呼び出しが多数のファイルに対して行われることを意味します。ファイルごとに個別に呼び出すのではなく (は に置き換えられます)、これにより大幅なスピードアップが得られる場合があります。findyourdirectory++\

于 2013-05-25T17:12:25.940 に答える