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 コマンド | コマンドの問い合わせを行いながら実行する |
検索したファイル名をフルパスで改行文字をつけて出力する | |
-print0 | 検索したファイル名をフルパスで表示し、改行せずに最後にNULL文字を付加する |
フォーマット検索したファイル名をフルパスでフォーマットで指定した形式で出力する |
サンプル
ファイル名を完全一致で検索をする。
$ 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]$