回答:
bashで再帰的なglobを実行するにはglobstar
、bashバージョン4以降の機能が必要です。
bashのマンページから:
globstar
If set, the pattern ** used in a pathname expansion context will
match all files and zero or more directories and subdirectories.
If the pattern is followed by a /, only directories and
subdirectories match.
サンプルパターンの場合:
shopt -s globstar
ls **/*.py
wc -l {**,.}/*.py
うまく動作します
find . -name '*.py'
** 1つ以上のことは行いません*、両方とも現在のディレクトリで動作します
find
bash 4を持っていない場合にできることはたくさんあります。例:(yourcommand `find . -name '*.py'`
バッククォートに注意してください); find . -name '*.py' -exec yourcommand {} \;
。
Bash 4(zshも含む)以降、新しいグロビングオプション(globstar
)が追加され、**
設定時にパターンを異なる方法で処理します。
ワイルドカードパターンと一致し、コマンド内のワイルドカードパターンを一致したアイテムで置き換えることにより、一致するファイル名とディレクトリ名を返します。
通常、を使用する場合**
、と同様に機能しますが*
、すべてのディレクトリを再帰的に再帰します(ループのように)。
有効になっているかどうかを確認するにはshopt globstar
、スクリプトで確認します(使用するにはを使用しますshopt -q globstar
)。
この例**.py
は、再帰可能なディレクトリのリストを返さないため、現在のディレクトリでのみ機能します**/*.py
。そのため、複数のディレクトリレベルのワイルドカードを使用する必要があるため、さらに深くすることができます。
すべてのファイルを再帰的に見つけるために行ったいくつかの構文テストを見つけてください。
nullglob