Linuxコマンド find(条件を指定してファイルを検索する)

目的のファイルをディレクトリツリーから検索するコマンドについて解説。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

参考サイト:Man page of INSTALL

使用方法

コマンドパス:/usr/bin/find

findコマンドを使用することで、引数で指定した検索開始パスのディレクトリを起点として、[検索条件]を満たすファイルを探します。なお検索条件を何も指定しない場合は、すべてのファイルとディレクトリが対象となります。

[検索条件]には、ファイル形式、更新日時ディレクトリ階層の深さなど指定できます。

書式

$ find [オプション] [検索開始パス・・・][検索条件][アクション]

オプション

-Lシンボリックリンクをたどる
-maxdepth LEVEL(数値)指定したディレクトリから最大LEVEL階層化のディレクトリまで検索する。
(1を指定した場合は、そのディレクトリ直下のみ検索する)
-mindepth LEVEL(数値)指定したディレクトリから少なくともLEVEL階層下から検索する
(1なら指定したディレクトリの下にあるサブディレクトリ以下から検索)
オプション一覧表

検索条件

-amin 数値ファイルへのアクセスがn分前である。
-anewer ファイル名ファイルへのアクセスが指定したファイルより新しい。
-atime nファイルへのアクセスがn*24時間前である。
-cmin nファイルの状態更新がn分前である。
-cnewer ファイル名ファイルが指定したファイルより新しい状態更新時間である。
-ctime nファイルの状態更新がn*24時間前である。
-mmin nファイルの修正がn分前である。
-mnewer ファイル名ファイルが指定したファイルより新しい
-mtime 日数ファイルの修正がn*24時間前である
-emptyファイルが空で、通常のファイルまたはディレクトリである
-fstype タイプファイルが存在するファイルシステムが指定したタイプである
-uid ユーザIDファイルの所有権ユーザIDである
-user ユーザ名ファイルの所有権ユーザ名である
-gid グループIDファイルの所有権グループIDである
-group グループ名ファイルの所有権グループ名である
-ilname 文字列指定した文字列の大文字/小文字を区別しない
-name ファイル名指定した文字列がディレクトリ名を除いた部分にマッチする
-iname 文字列指定した文字列の大文字/小文字を区別しない
-ipath 文字列指定した文字列の大文字/小文字を区別しない
-iregex 文字列指定した文字列の大文字/小文字を区別しない
-newer ファイル名指定したファイル名より後に修正されている
-nouserファイルのユーザIDに対応するユーザがない
-nogroupファイルのグループIDに対応するグループがいない
-path パターン指定したパターンにマッチする
-perm -モード指定したモードとファイルのパーミッションが同じである。
-perm /モード指定したモードにファイルのパーミッションの1つでもマッチする。
非推奨であるが「+モード」という指定も可能
-regex パターン指定したパターンにマッチする
-size サイズ指定したサイズよりも大きいサイズを利用する。サイズに単位を付属できる。「20M
」で20MBを示す
-type ファイルタイプ指定したファイルタイプと同じ
評価式

-sizeオプションで指定可能なサイズ

記号説明
bブロック(512バイト)
cバイト
wワード(2バイト)
kキロバイト(1024バイト)
Mメガバイト(1024*1024バイト)
Gギガバイト(1024*1024*1024バイト)

-typeオプションで指定可能なサイズ

記号説明
bブロックファイル
cキャラクタファイル
dディレクトリ
p名前付きパイプ
fファイル
lシンボリックリンク
sソケットファイル

アクション

-exec コマンド \;
-exec コマンド{}+
-execdir コマンド \;
-execdir コマンド{}+
コマンドを実行する。コマンドへの引数には「{}」と、引数の終わりを示す「;」を
使う。
「;」はエスケープが必要なので実際には「コマンド オプション{}\;」のような
記述になる
-deleteファイルを削除する
-ls「ls -dils」と同じ動作をする
-fprint ファイル名検索したファイル名のフルパスを指定したファイルに出力する
-ok コマンドコマンドの問い合わせを行いながら実行する
-print検索したファイル名をフルパスで改行文字をつけて出力する
-print0検索したファイル名をフルパスで表示し、改行せずに最後にNULL文字を付加する
-printフォーマット検索したファイル名をフルパスでフォーマットで指定した形式で出力する

サンプル

ファイル名を完全一致で検索をする。

$ find samle/ -name sample.txt 

実行結果

[centos@xxx work]$ tree
.
├── sample
└── sample1
    ├── sample1.txt
    └── work

3 directories, 1 file
[centos@xxx work]$ find -name sample1.txt
./sample1/sample1.txt
[centos@xxx work]$ 

ワイルドカードを使用して検索をする

-nameオプションを使用した場合、パターンマッチによるファイル名の指定ができます。*(アスタリスク)などのワイルドカードを使用する場合は、’(シングルコーテーション)、”(ダブルコーテーション)でパターンマッチを囲う必要がある。

囲わなかった場合、シェルに展開される可能性がある。

*.txtは、ファイル名.txtとなっているものが検索対象となる。

サンプル

$ find ./ -name '*.txt'

実行結果

[centos@xxx work]$ tree
.
├── sample
├── sample1
│   ├── sample1.txt
│   └── work
└── work.txt

3 directories, 2 files
[centos@xxx work]$ find ./ -name '*.txt' #拡張子がtxtとなっているファイルがすべて検索される。
./sample1/sample1.txt
./work.txt
[centos@xxx work]$ 

特定のユーザが所有するファイルを検索する

-userオプションで指定したユーザが所有するファイルを検索することができる。

サンプル

$ find sample -user centos

実行結果

[root@xxx work]# find sample -user centos
sample/sub_sample/sample1.txt
[root@xxx work]# 

特定のグループが所有するファイルを検索する

-groupオプションで指定したグループが所有するファイルを検索することができる。

サンプル

$ find sample -group centos

実行結果

[root@xxx work]# find sample -group centos
sample
sample/sub_sample/sample1.txt
[root@xxx work]# 

ファイルサイズを指定して検索する

サンプル

ファイルサイズが1バイトのファイルを検索する。

$ find work/ -size 1

実行結果

[centos@xxx ~]$ find work/ -size 1
work/
work/sample1
work/sample1/sample1.txt
work/sample1/work
work/sample
work/work.txt
[centos@xxx ~]$ 

最終更新日後から経過している検索する

指定したディレクトリ配下から最終更新後31日以上経過しているファイルを検索する。

サンプル

$ find work/ -mtime +30

検索に該当するファイルの詳細を表示する

-exec アクションにls -l {} \;を指定することにより、検索結果のファイル・ディレクトリの詳細を表示することができる。バックスラッシュはキーボードの\マークを押すことで入力できる。また、バックスラッシュの前は半角スペースで区切ること。

サンプル

$ find sample1/ -name 'sample*' -exec ls -l {} \;

実行結果

[centos@xxx work]$ find sample1/ -name 'sample*' -exec ls -l {} \;
total 4
-rwxrwx--x 1 centos centos 3 Apr 21 07:36 sample1.txt
drwxrwx--x 2 centos centos 6 Apr 21 07:36 work
-rwxrwx--x 1 centos centos 3 Apr 21 07:36 sample1/sample1.txt
[centos@xxx work]$ 

特定の期間内に修正されたファイルを削除する

3日以上、7日以内に修正されたファイルの削除

サンプル

$  find sample1/ -type f -mtime +3 -mtime -7 -exec rm -vf {} \;

findの出力を使ってファイルをアーカイブする

対象ファイルが多すぎてコマンドラインが溢れる場合は、

サンプル

$ find sample1/ -type f -name '*.txt' -print | xargs tar cfvz ./sample.tgz

実行結果

[centos@xxx work]$ tree
.
├── sample
├── sample1
│   ├── sample1.txt
│   ├── sample2.txt
│   └── work
└── work.txt

3 directories, 3 files

[centos@xxx work]$ find sample1/ -type f -name '*.txt' -print | xargs tar cfvz ./sample.tgz
sample1/sample1.txt
sample1/sample2.txt
[centos@xxx work]$ ls -l
total 8
drwxr-x--- 2 centos centos   6 Apr 23 22:01 sample
drwxrwxr-x 3 centos centos  56 Apr 25 03:36 sample1
-rw-rw-r-- 1 centos centos 150 Apr 25 03:37 sample.tgz
-rw-rw-r-- 1 centos centos   4 Apr 24 23:17 work.txt
[centos@xxx work]$ 

検索結果を利用してファイルを削除する

-exec アクションに rm -rf コマンドを指定することにより、検索結果のファイルを削除することができる。

サンプル

$ find sample1/ -type f -name 'sample*' -exec rm -vf {} \;

実行結果

[centos@xxx work]$ tree
.
├── sample
├── sample1
│   ├── sample1.txt
│   └── work
└── work.txt

3 directories, 2 files
[centos@xxx work]$ find sample1/ -type f -name 'sample*' -exec rm -vf {} \;
removed ‘sample1/sample1.txt’
[centos@xxx work]$ tree
.
├── sample
├── sample1
│   └── work
└── work.txt

3 directories, 1 file
[centos@xxx work]$ 

ファイル数を表示する

findとwcコマンドを組み合わせることにより、ファイルの数を調べることができる。wcコマンドは標準出力の文字数を計算して標準出力である画面に計算結果を表示するコマンドですが、-lオプションを利用することにより行数をカウントして標準出力に表示します。

サンプル

/home/centosディレクトリに含まれるサブディレクトリ数を調べる。

$ find /home/centos/ -type f|wc -l

実行結果

[root@xxx work]# find /home/centos/ -type f|wc -l
1642
[root@xxx work]# 

サブディレクトリ数を表示する

findとwcコマンドを組み合わせることにより、サブディレクトリの数を調べることができる。

サンプル

/home/centosディレクトリに含まれるサブディレクトリ数を調べる。

$ find /home/centos/ -type d|wc -l

実行結果

[root@xxx work]# find /home/centos/ -type d|wc -l
211
[root@xxx work]# 

ファイルを検索した結果をファイルに保存する。

リダイレクトを使用することで、findの実行結果をテキストファイルに書き出すことができる。

サンプル

$ find sample1/ -type f -name '*.txt' > find_result.txt

実行結果

[centos@xxx work]$ find sample1/ -type f -name '*.txt' > find_result.txt #リダイレクトで検索結果をテキストファイルに保存
[centos@xxx work]$ ls -l
total 12
-rw-rw-r-- 1 centos centos  40 Apr 25 03:51 find_result.txt #検索結果が保存されているテキストファイル
drwxr-x--- 2 centos centos   6 Apr 23 22:01 sample
drwxrwxr-x 3 centos centos  56 Apr 25 03:47 sample1
-rw-rw-r-- 1 centos centos 123 Apr 25 03:41 sample.tgz
-rw-rw-r-- 1 centos centos   4 Apr 24 23:17 work.txt
[centos@xxx work]$ cat find_result.txt #ファイルの中身を表示
sample1/sample2.txt
sample1/sample1.txt
[centos@xxx work]$