web-dev-qa-db-ja.com

filename.extensionでのみ正規表現パターンに一致します

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は機能しますが、ファイルへのパスは返されません。ファイルがどこにあるかを知るために必要です。

2
Alex

ファイルへのフルパスを取得した場合、lsgrepが機能するとおっしゃいましたが、findgrepはどうですか? 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には.の後に文字または数字が含まれていないため、一致しません。

2
Rain
find dir -regex '.*/[^/]*love[^/]*$'
0
user1686