filename.extension
に一致するデフォルトの代わりに、/path/to/filename.extension
で正規表現パターンに一致するファイルを見つけるためにfind
を使用する必要があります。
例えば:
/folder
|--a-love-song.ogg
|--a-jazz-song.ogg
+--love-songs
+--a-blues-song.ogg
そして、/folder
とそのサブディレクトリで、ファイル名に.*love.*
が含まれるファイルを見つけたいと思います。
debian@debian:~$ find folder -regex ".*love.*"
folder/a-love-song.ogg
folder/love-songs # Shouldn't be returned
folder/love-songs/a-blues-song.ogg # Shouldn't be returned
マニュアルページを読んで、ファイル名のみを検索するオプション-name
があることに気付きましたが、正規表現が許可されていないようで、-name -regex
が機能しません。
パスを無視するために正規表現を使用してみました:
debian@debian:~$ find folder -regex "\/.*love.*$"
しかし、それは何も返しませんでした。もちろんls | grep
は機能しますが、ファイルへのパスは返されません。ファイルがどこにあるかを知るために必要です。
ファイルへのフルパスを取得した場合、ls
とgrep
が機能するとおっしゃいましたが、find
とgrep
はどうですか? grep
はその行のどこかに一致が見つかった場合にその行を返すため、正規表現はファイル名の前に/
sがなく、検索文字列が含まれているものと一致する可能性があります。
$ find folder | grep -i '[^/]*love[^/]*\.[a-z0-9]*'
それは私にとってはうまくいくようです。すべての拡張子に番号がないことがわかっている場合、または照合するすべてのファイルに特定の拡張子があることがわかっている場合は、拡張子の一致を減らすことができます。
$ find folder
folder
folder/a-love-song.ogg
folder/love-songs
folder/love-songs/a-blues-song.ogg
folder/love-songs/another-love-song.ogg
$ find folder | grep -i '[^/]*love[^/]*\.[a-z0-9]*'
folder/a-love-song.ogg
folder/love-songs/another-love-song.ogg
[^/]*
:/
以外の任意の数の文字に一致しますlove[^/]*
:文字列love
に一致し、次に/
以外の任意の数の文字に一致します\.[a-z0-9]*
:.
に一致し、次に任意の数の文字または数字に一致しますまとめると、[^/]*love[^/]*\.[a-z0-9]*
は、love
の両側にある/
以外の文字と一致し、末尾に拡張子が付いています。文字列a/love/path/love-file.ogg
が与えられると、上記の正規表現はlove-file.ogg
にのみ一致します。リーフフォルダにlove
が含まれている場合(例:a/path/love-leaf
)、love-leaf
には.
の後に文字または数字が含まれていないため、一致しません。
find dir -regex '.*/[^/]*love[^/]*$'