bashスクリプトで、パスに「二重拡張子」のサブディレクトリが含まれていないファイルを見つけたいと思います。たとえば、forのサブディレクトリを探していて/my/home
、path/to/my/file
次のものが存在する場合、スクリプトは最初のサブディレクトリのみを検索します。
/my/home/subdirectory.1/path/to/my/file
/my/home/subdirectory.1.2/path/to/my/file
これは単純化された例です。andは1
任意2
の文字列です。重要な点は、それらがファイル拡張子のようなものである(つまり、ピリオドで区切られている)ことです。
使うことができますls
$ ls /my/home/subdirectory.*/path/to/my/file
しかし、これは両方を返します-私は置き換えたい.*
のです.[^.]*
が、それは正規表現であり、グロブは正規表現を使用しません。拡張グロブを試しましたが、機能しません(拡張グロブに慣れていないことを認めてうれしいです):
$ shopt -s extglob
$ ls /my/home/subdirectory.!(.*)/path/to/my/file
私find
はこれを次のように行うために使用できることを知っています:
$ find /my/home/subdirectory* -regex "/my/home/subdirectory.[^.]*/path/to/my/file"
しかし、私はグロブがより速くなることを期待します。ただし、これを読んだことで、これはBashのグロブの能力を超えていると思います。しかし、それは議論する価値のある良い質問だと思いました。