
特定の文字列/正規表現値を持つすべてのファイルを検索しようとしています。では、名前に「hello」を含むすべてのファイルを検索するにはどうすればよいですか?状況をより複雑にするために、名前が2文字で始まり、その後にダッシュと数字が続くファイルをどのように見つけますか?
私はfindコマンドを試しましたが、それがhelloのケースに役立ちました。入力が必要find <dir> *hello*
ですが、正規表現の値では機能しません。
入力するとfind -E <dir> -regex '^[a-z]{2}-[1-9]'
何も起こりません。と入力してもfind -E <dir> -regex '*[0-9]*'
何も起こりません。
誰でもこの問題を解決するのに役立ちますか?事前にありがとう
答え1
-regex
フルファイルパス(名前だけでなく)と一致し、デフォルトで(暗黙的^
に)$
アンカーを一致させます。
ここでは正規表現は必要なく、-name
ワイルドカードパターンを使用し、パスの代わりにファイル名と一致する基準を使用できます。
find . -name '*hello*' -name '[[:alpha:]][[:alpha:]]-[1-9]*'
2文字、ハイフン、1から9の間の数字で始まり、「hello」を含むファイル名の場合。
正規表現を使用すると(この場合はFreeBSD / OS / X)、find
これは次のようになります。
find -E . -regex '.*hello[^/]*' -regex '.*/[[:alpha:]]{2}-[1-9][^/]*'
[^/]*
たとえば、反対方向の代わりにこの値が必要で、.*
一致します。./aa-9/hello/foo/bar
とにかく、find <dir> *hello*
それはあなたが思うようになりません。シェルは、*hello*
このglobを名前に "hello"を含む現在のディレクトリの非表示のファイルまたはディレクトリのリストに展開し、結果を追加の引数として渡しますfind
。
答え2
失敗したから*[0-9]*
そうです。正規表現の代わりにglob。 globとは*
「0個以上の文字」を意味します。ただし、正規表現では*
「*の前に0個以上」を意味します。つまり*
、量子
そしてそれはあなたが何かを定量化する場合にのみ意味があります。
したがって、ゼロ個以上の文字とゼロ個以上の数字を一致させる正規表現は です.*[0-9]*
。また-regex
、withを使用すると、find
正規表現はファイルのパターン全体と一致するため、これを考慮する必要があります。これらすべてをまとめると、あなたが探しているものは次のとおりです。
find /path/to/dir -regex '.*/[a-z][a-z]-[1-9].*'
最後に、これらの構造はfindに渡すときに常に引用する必要があります。そうしないと、シェルはこれ*
をfind
。