【図解:bash】 findコマンドの使い方(ファイル検索)

findコマンドは、ファイルやディレクトリを指定した条件で検索することができるコマンドです。
基本的な使い方は次のようになります。
find <検索対象のパス> <検索条件>
例えば、/home/hirotano ディレクトリ以下で、名前がdata1であるファイルを検索するには次のようにします。
hirotano@linux-1:~$ find /home/hirotano/ -name data1
/home/hirotano/data1

findでは、ファイルの名前や種類、更新日時など、様々なオプションを検索条件として指定し、検索することができます。
この記事では、よく使用されるオプションを使用し、検索の実行とその結果を確認していきます。
参考までに、検索対象としたカレントディレクトリ内のファイル名やディレクトリ名の一覧は下記とします。
hirotano@linux-1:~$ ls -la
合計 1034312
drwxr-xr-x 8 hirotano hirotano       4096 12月 25 04:33 .
drwxr-xr-x 3 root     root           4096  7月 31 06:45 ..
-rw------- 1 hirotano hirotano       7189 12月 25 05:29 .bash_history
-rw-r--r-- 1 hirotano hirotano        220  2月 25  2020 .bash_logout
-rw-r--r-- 1 hirotano hirotano       3771  2月 25  2020 .bashrc
drwx------ 2 hirotano hirotano       4096  7月 31 06:49 .cache
drwx------ 3 hirotano hirotano       4096 12月 11 02:15 .config
-rw------- 1 hirotano hirotano         69 12月 24 14:31 .lesshst
drwxrwxr-x 3 hirotano hirotano       4096 12月 18 08:19 .local
-rw-r--r-- 1 hirotano hirotano        807  2月 25  2020 .profile
drwx------ 2 hirotano hirotano       4096  7月 31 08:42 .ssh
-rw-r--r-- 1 hirotano hirotano          0  7月 31 06:49 .sudo_as_admin_successful
-rw------- 1 hirotano hirotano       8860 12月 11 11:14 .viminfo
-rw-rw-r-- 1 hirotano hirotano          0 12月 19 12:00 1-music
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:17 11-music
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:17 2-music
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:05 Backup111
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:05 Backup222
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:05 Backup333
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:06 IMAGE
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:05 IMAGE1
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:06 IMAGE12
-rw-rw-r-- 1 hirotano hirotano   10485760 12月 25 01:42 data1
-rw-rw-r-- 1 hirotano hirotano 1048576000 12月 25 03:51 data11
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:04 data111
drwxrwxr-x 2 hirotano hirotano       4096 12月 24 08:50 dir1
drwxrwxr-x 2 hirotano hirotano       4096 12月 24 06:03 dir11
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:04 file1
-rw-rw-r-- 1 hirotano hirotano          0 12月 24 06:04 file2.txt
スポンサーリンク

名前で検索(-name)

上の例で見た通り、-nameオプションの後に、検索したい名前を指定し、検索することができます。
ある文字列を含むなど、ワイルドカード*など)を使用して、名前を検索することもできます。
この記事で使用するワイルドカードの説明は、下記の記事を参考にしてください。

  >> 参考記事 : 【図解:bash】 パス名展開(ワイルドカード)の使用方法

【図解:bash】 パス名展開(ワイルドカード)の使用方法
ある文字列のパターンを記述することで、複数の文字列を一度に生成する機能としてブレース展開がありました。 >> 参考記事 :【図解:bash】ブレース展開の使用方法 Linuxでは、ファイル名を指定してなんらかの処理をすることが多くあります。...
例えば、dから始まる名前のファイルを検索したい場合は、下記となります。
検索対象のパスは、カレントディレクトリ . )とします。
ワイルドカードを使用する場合、引用符(下の例では、シングルクォート)で、囲む必要があります。
hirotano@linux-1:~$ find . -name 'd*'     
./dir11
./data11
./data111
./dir1
./data1

引用符がない場合、ワイルドカードは、findコマンドの実行より先にパス名展開をします。-nameのあとに、展開後の文字列が列挙されて、findコマンドが実行されるため、エラーとなります。

findには、展開前のワイルドカードのまま(d*)で実行する必要があります。

アスタリスク*)の前にバックスラッシュをいれることで、パス名展開をエスケープすることもできます。
hirotano@linux-1:~$ find . -name d\*
./dir11
./data11
./data111
./dir1
./data1

スポンサーリンク

ファイルタイプで検索(-type)

ファイルなのかディレクトリなのかを条件に検索するには、-typeオプションを使用します。
ファイルの場合は f、ディレクトリの場合は d、シンボリックリンクの場合は l  を指定します。
下記は、カレントディレクト内のディレクトリを検索しています。
hirotano@linux-1:~$ find . -type d
.
./.local
./.local/share
./.local/share/nano
./dir11
./.ssh
./dir1
./.config
./.config/procps
./.cache

スポンサーリンク

ファイルサイズで検索(-size)

ファイルサイズを条件に検索するには、-sizeオプションを使用します。
カレントディレクトリで、5Mバイトを超えるファイルを検索するには、-sizeオプションの後に、+5Mとします。
hirotano@linux-1:~$ find . -size +5M 
./data11
./data1
単位は、M(メガ)の他に、K(キロ)G(ギガ)c(バイト)も使えます。
はその値を超える、はその値を下回ることを表します。+や-を省略すると、値が一致していることを意味します。

スポンサーリンク

更新日数で検索(-mtime)

ファイルが更新された日数を条件に検索するには、-mtimeオプションを使用します。
-mtime指定された日数より前に変更されたファイルを検索します。
カレントディレクトリで、5日前に変更されたファイルを検索するには、-mtimeのあとに、日数である5を指定します。
hirotano@linux-1:~$ find . -mtime 5
./1-music

上の例は、ピッタリと5日前に更新されたことを条件としています。
5日より後の更新日であれば-5 、5日より前の更新日であれば+5と指定します。
下記は、5日より後の更新日のファイルを検索しています。
hirotano@linux-1:~$ find . -mtime -5
.
./.bash_history
./dir11
./2-music
./11-music
./IMAGE12
./Backup111
./data11
./.lesshst
./IMAGE1
./file2.txt
./data111
./dir1
./file1
./Backup333
./IMAGE
./data1
./Backup222

スポンサーリンク

複数条件の指定

検索条件は、複数指定することができます。
上の例ですと、5日前に更新され、かつ、名前にmusicが含まれているファイルを検索する場合は、下記となります。
hirotano@linux-1:~$ find . -name '*music' -mtime 5
./1-music

さらに、論理演算子として、ANDORも指定できます。
ORの場合、構文は下記(-or)となります。 ANDの場合は、-and となります。
( 検索条件1 ) -or  ( 検索条件2 )
例えば、dataで始まる名前、もしくは、更新日が5日前のファイルを検索する場合は下記となります。
hirotano@linux-1:~$ find . \( -name 'data*' \) -or \( -mtime 5 \)       
./data11
./1-music
./data111
./data1
カッコ( や )は、bashにおいて特殊文字のため、バックスラッシュでエスケープする必要があります。
また、検索条件の前後にはスペースを含める必要があります。

また、論理演算子として、-not オプションを使うことにより、指定された条件を満たさないファイルを検索できます。
条件の前に、-notをつけます。
hirotano@linux-1:~$ find . \( -name '*music' \) -and \( -not -mtime 5 
\)
./2-music
./11-music

スポンサーリンク

アクション

findの検索結果に対してアクションを実行するオプションがあります。何もオプションを付けない場合のデフォルトのアクションは、検索結果の出力-print)です。
-printをつけて出力すると下記となります。
hirotano@linux-1:~$ find . -name 'd*' -print
./dir11
./data11
./data111
./dir1
./data1
あとは、ファイルの更新日時やファイルサイズ、パーミッションなどがわかるよう、-lsオプションにより、ls形式で出力することもできます。
hirotano@linux-1:~$ find . -name 'd*' -ls
   524312      4 drwxrwxr-x   2 hirotano hirotano     4096 12月 24 06:03 ./dir11
   393253 1024004 -rw-rw-r--   1 hirotano hirotano 1048576000 12月 25 03:51 ./data11
   393254       0 -rw-rw-r--   1 hirotano hirotano          0 12月 24 06:04 ./data111
   524311       4 drwxrwxr-x   2 hirotano hirotano       4096 12月 24 08:50 ./dir1
   393252   10240 -rw-rw-r--   1 hirotano hirotano   10485760 12月 25 01:42 ./data1
検査結果の対象のファイルを-deleteオプションにより削除することもできます。
下記のとおり、dから始まるファイルは削除されます。
hirotano@linux-1:~$ find . -name 'd*' -delete
hirotano@linux-1:~$ find . -name 'd*'
hirotano@linux-1:~$

コメント