2

bashスクリプトで、パスに「二重拡張子」のサブディレクトリが含まれていないファイルを見つけたいと思います。たとえば、forのサブディレクトリを探していて/my/homepath/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のグロブの能力を超えていると思います。しかし、それは議論する価値のある良い質問だと思いました。

4

2 に答える 2

2

試す:

ls /my/home/subdirectory!(.*.*)/path/to/my/file

また

ls /my/home/subdirectory.!(*.*)/path/to/my/file

拡張子のないディレクトリを一致させるかどうかによって異なります。

于 2013-03-18T20:59:57.870 に答える
2

あなたが欲しいのは

ls /my/home/direcectory.+([!.])/path/to/my/file

.これは、拡張子の1つ以上の非文字と一致します。

于 2013-03-18T21:00:15.567 に答える