find -regexオプションの使い方|正規表現でファイル名を柔軟に検索する方法
生徒
「先生、Linuxのfindコマンドでファイル名を柔軟に検索するにはどうすればいいんですか?」
先生
「そういうときは-regexオプションを使うと便利だよ。正規表現という方法で、特定のパターンに合うファイルを探せるんだ。」
生徒
「正規表現って難しそう…でも便利そうですね!」
先生
「心配いらないよ。わかりやすく一緒にやってみよう!」
1. findコマンドとは?
findコマンドは、Linuxでファイルやディレクトリを検索する基本的なコマンドです。名前で探したり、更新日時で探したり、大きさで絞ったりと、色んな条件でファイルを見つけられる優れものです。
2. -regexオプションとは?
-regexオプションは、ファイルのパスが正規表現にマッチするかどうかで検索できる機能です。「正規表現(せいきひょうげん)」とは、文字列のパターンを表す記号のようなもので、特定のルールに合った文字列を探し出すために使われます。
例えば「.txtで終わるファイル」「数字で始まるファイル」「英字だけのファイル名」などを柔軟に探すことができます。
3. 正規表現の基本をざっくり解説
初心者向けに、代表的な正規表現の記号をいくつか紹介します。
^:先頭を意味します$:末尾を意味します.*:どんな文字列にもマッチします(何文字でもOK)[0-9]:0〜9の数字にマッチします[a-z]:小文字アルファベットにマッチします
これらを組み合わせることで、かなり柔軟な検索が可能になります。
4. 実際にfind -regexを使ってみよう
たとえば、次のようなファイル構成があるとします。
mkdir sampledir
cd sampledir
touch file1.txt file2.txt data1.csv data2.csv image.png
この中から、「.txt」で終わるファイルだけを検索したいとき、次のように-regexオプションを使います。
find . -regex '.*\.txt'
./file1.txt
./file2.txt
ポイント:
findコマンドの-regexは、「ファイル名だけ」ではなく「パス全体」でマッチするかを見ているので、./も含めて正規表現を書く必要があります。
5. 特定のパターンを持つファイルを探す応用例
「数字で始まって.txtで終わるファイル」だけを検索したい場合は次のように書けます。
find . -regex '\./[0-9].*\.txt'
また、「拡張子がcsvのファイル」だけを検索するなら次のようになります。
find . -regex '.*\.csv'
./data1.csv
./data2.csv
6. -nameオプションとの違いを理解しよう
-nameオプションもファイル名で検索できますが、これは「ワイルドカード(*や?)」による単純な文字列パターンの指定になります。
-regexの方が、もっと複雑で柔軟な検索ができるというメリットがあります。
find . -name "*.txt"
./file1.txt
./file2.txt
このように-nameは簡単で直感的に使えますが、-regexは範囲指定や複雑なパターンに対応できるので、慣れてきたらぜひ使いこなしましょう。
7. 正規表現のエンジンに注意しよう(Emacs式)
Linuxのfindコマンドで使われる正規表現は「Emacs式正規表現」が基本になっています。これは、PerlやGrepなどで使われる正規表現とは少し違う点もあるので、完全一致が求められる場合などには注意が必要です。
たとえば、全体一致(パス全体にマッチ)なので、.*を冒頭や末尾につけ忘れると結果が出ない場合があります。
8. よく使うfind -regexのパターン例
.*\.log:ログファイルだけ探す\./data[0-9]+\.csv:data0.csv~data9.csvのようなファイル\./[a-z]+\.txt:英字のみのファイル名かつ拡張子がtxt
こうした書き方を覚えておくと、特定のファイルを一瞬で見つけることができるようになります。