再帰的なグローバル?

再帰的なグローバル?

私は次のようなものを書きたいです:

$ ls **.py

すべての.pyファイル名を取得するには、ディレクトリ階層を再帰的に巡回してください。

検索する.pyファイルがあっても、シェルは次の出力を提供します。

ls: cannot access **.py: No such file or directory

私が望むことをする方法はありますか?

編集する:私は特定のケースに興味がないことを指摘したいと思いますls。しかし、質問はglob構文についてです。

答え1

Bashで再帰的なglobを実行するには、globstarBashバージョン4以上の機能が必要です。

~からバッシュ文書:

globstar
**設定されている場合、ファイル名拡張コンテキストで使用されるパターンは、すべてのファイルとゼロ以上のディレクトリとサブディレクトリと一致します。パターンの後に行くと、/ディレクトリとサブディレクトリのみが一致します。

サンプルパターンの場合:

shopt -s globstar
ls -d -- **/*.py

shopt -s globstar実行するには実行する必要があります。この機能はbashでデフォルトで有効になっていないため、shopt実行して有効にできます。

答え2

find . -name '*.py'

**一度だけ実行*タスク、両方とも現在のディレクトリで動作します

答え3

Bash 4から始まる(zshも含む)新しいワイルドカードオプションモードを設定するときにモードを異なる方法で処理する()を追加しましたglobstar**

ワイルドカードパターンを一致させ、コマンドのワイルドカードパターンを一致するものに置き換えて、一致するファイルとディレクトリ名を返します。

通常使用すると**同様に機能します*が、すべてのディレクトリを繰り返しループします(ループのように)。

有効になっていることを確認するには、shopt globstar(スクリプトで使用shopt -q globstar)で確認してください。

この例では、**.py繰り返すことができるディレクトリのリストは返されないため、現在のディレクトリに対してのみ機能します。したがって、**/*.pyより深く入るには、複数のディレクトリレベルのワイルドカードを使用する必要があります。

ねえ再帰的にファイルを検索する例。

関連情報