- 1. findコマンドとは
- 2. 検証環境
- 3 ファイルタイプで検索する方法(-type)
- 4 ユーザで検索する方法(-user)
- 5 パーミッションで検索する方法(-perm)
- 6 サイズで検索する方法(-size)
- 7 時間で検索する方法
- 8 パターンで検索する方法
- 9 条件を絞り込む方法
- 10 検索するディレクトリの深さを指定する方法
- 11 アクションの使い方
- 12 特殊なファイルアクセス権(setuid,setgid,stickyビット)を持ったファイルの検索方法
- 13 条件に合致したファイルを削除する方法(-delete)
- 14 実行ファイルを見つける方法
- Z 参考情報
1. findコマンドとは
ファイルやディレクトリを検索するコマンドです。
2. 検証環境
CentOS版数は次のとおりです。
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
カーネル版数は次のとおりです。
[root@server ~]# uname -r 3.10.0-1160.el7.x86_64
3 ファイルタイプで検索する方法(-type)
3.1 通常ファイルを検索する方法(f)
カレントディレクトリ配下の通常ファイルを検索してみます。
[root@server ~]# find . -type f -snip-
3.2 ディレクトリを検索する方法(d)
[root@server ~]# find . -type d -snip-
3.3 名前付きパイプを検索する方法(p)
/run配下の名前付きパイプを検索してみます。
[root@server ~]# find /run -type p /run/initctl /run/dmeventd-client /run/dmeventd-server -snip-
ファイルタイプを確認してみます。名前付きパイプであることがわかります。
[root@server ~]# file /run/initctl /run/initctl: fifo (named pipe)
3.4 ソケットを検索する方法(s)
/run配下のソケットを検索してみます。
[root@server ~]# find /run -type s /run/gssproxy.sock /run/chrony/chronyd.sock -snip-
ファイルタイプを確認してみます。ソケットであることがわかります。
[root@server ~]# file /run/gssproxy.sock /run/gssproxy.sock: socket
3.5 シンボリックリンクを検索する方法(l)
/usr/sbin配下のシンボリックリンクを検索してみます。
[root@server ~]# find /usr/sbin -type l /usr/sbin/iptables-restore-translate /usr/sbin/mkfs.msdos /usr/sbin/mkfs.vfat /usr/sbin/vigr -snip-
ファイルタイプを確認してみます。シンボリックリンクであることがわかります。
[root@server ~]# file /usr/sbin/iptables-restore-translate /usr/sbin/iptables-restore-translate: symbolic link to xtables-nft-multi [root@server ~]# ls -l /usr/sbin/iptables-restore-translate lrwxrwxrwx. 1 root root 17 8月 18 2020 /usr/sbin/iptables-restore-translate -> xtables-nft-multi
4 ユーザで検索する方法(-user)
/var配下のディレクトリにおいて、apacheユーザが所有するファイルを検索してみます。
[root@server ~]# find /var -user apache /var/lib/dav /var/lib/httpd /var/cache/httpd /var/cache/httpd/proxy /var/cache/httpd/ssl
ファイルの詳細を確認してみます。apacheユーザが所有していることがわかります。
[root@server ~]# ls -ld /var/lib/dav drwx------. 2 apache apache 6 11月 4 2020 /var/lib/dav
5 パーミッションで検索する方法(-perm)
ファイルのパーミッションが755であるものを検索します。
[root@server ~]# find /usr/bin -perm 755 /usr/bin/trust /usr/bin/catchsegv /usr/bin/setxkbmap -snip-
ファイルのパーミッションを確認します。 パーミッションが755であることがわかります。
[root@server ~]# ls -l /usr/bin/trust -rwxr-xr-x. 1 root root 239200 7月 2 2019 /usr/bin/trust
6 サイズで検索する方法(-size)
6.1 サイズを指定する方法
事前準備として、1024バイトと2048バイトのファイルを作成します。ファイルの作成方法は、ファイルの作り方 - hana_shinのLinux技術ブログを参照してください。
[root@server ~]# mkdir /test [root@server ~]# fallocate -l 1024 /test/1024.dat [root@server ~]# fallocate -l 2048 /test/2048.dat
作成したファイルのファイルサイズとinode番号を確認します。 なお、inode番号は左端の値になります。
[root@server ~]# ls -li /test/ 合計 8 19026495 -rw-r--r--. 1 root root 1024 12月 19 11:46 1024.dat 19026497 -rw-r--r--. 1 root root 2048 12月 19 11:46 2048.dat
1024(byte)のファイルを検索してみます。
[root@server ~]# find /test -size 1024c /test/1024.dat
2(Kbyte)のファイルを検索してみます。
[root@server ~]# find /test -size 2k /test/2048.dat
1024バイトより大きいファイルを検索してみます。
[root@server ~]# find /test -size +1024c /test/2048.dat
2048バイトより小さいファイルを検索してみます。 /testディレクトのサイズが38バイトなので、/testディレクトリも表示されています。
[root@server ~]# find /test -size -2048c /test /test/1024.dat
/testディレクトのサイズは、以下のとおり38バイトです。
[root@server ~]# ls -ld /test drwxr-xr-x. 2 root root 38 12月 19 11:46 /test
ファイルサイズが1000バイトより大きく、2000バイト未満のファイルを検索してみます。
[root@server ~]# find /test -size +1000c -size -2000c /test/1024.dat
7 時間で検索する方法
7.1 分で検索する方法(-mmin)
ファイルのタイムスタンプを確認します。
[root@server ~]# ls --full-time /test/*dat -rw-r--r--. 1 root root 1024 2021-12-19 11:46:21.208788721 +0900 /test/1024.dat -rw-r--r--. 1 root root 2048 2021-12-19 11:46:26.735847371 +0900 /test/2048.dat
現在の時刻を確認します。
[root@server ~]# date 2021年 12月 19日 日曜日 17:44:24 JST
5分以上前に更新したファイルを検索します。 テスト用に作成したファイル見つかりました。
[root@server ~]# find /test -mmin +5 /test /test/1024.dat /test/2048.dat
5分以内に更新したファイルを検索します。 検索結果になにも表示されないことがわかります。
[root@server ~]# find /test -mmin -5 [root@server ~]#
7.2 日で検索する方法(-mtime)
1日以内に更新したファイルを検索します。 テスト用に作成したファイルが見つかったことがわかります。
[root@server ~]# find /test -mtime -1 /test /test/1024.dat /test/2048.dat
1日より前に更新したファイルを検索してみます。 そのようなファイルは無いことがわります。
[root@server ~]# find /test -mtime +1 [root@server ~]#
7.3 指定した日時より新しいファイルを検索する方法(-newer )
テスト用のファイルを確認します。
[root@server ~]# ls --full-time /test/* -rw-r--r--. 1 root root 1024 2021-12-19 11:46:21.208788721 +0900 /test/1024.dat -rw-r--r--. 1 root root 2048 2021-12-19 11:46:26.735847371 +0900 /test/2048.dat
1024.datより新しいタイムスタンプのファイルを検索してみます。
[root@server ~]# find /test -newer /test/1024.dat /test /test/2048.dat /test/4096.dat
次に、2048.datより新しいタイムスタンプのファイルを検索してみます。
[root@server ~]# find /test -newer /test/2048.dat /test /test/4096.dat
8 パターンで検索する方法
8.1 指定したパターンで検索する方法
テスト用ファイルを作成します。
[root@server ~]# fallocate -l 4096 /test/4096.DAT
テスト用ファイルを確認します。
[root@server ~]# ls -l /test/* -rw-r--r--. 1 root root 1024 12月 19 11:46 /test/1024.dat -rw-r--r--. 1 root root 2048 12月 19 11:46 /test/2048.dat -rw-r--r--. 1 root root 4096 12月 19 18:49 /test/4096.DAT
拡張子がdatのファイルを検索してみます。
[root@server ~]# find /test -name "*.dat" /test/1024.dat /test/2048.dat
拡張子がDATのファイルを検索してみます。
[root@server ~]# find /test -name "*.DAT" /test/4096.DAT
大文字、小文字を区別しないで拡張子datのファイルを検索してみます。
[root@server ~]# find /test -iname "*.dat" /test/1024.dat /test/2048.dat /test/4096.DAT
9 条件を絞り込む方法
9.1 事前準備
テスト用のファイルを作成します。
[root@server ~]# mkdir /test [root@server ~]# touch /test/1024.dat [root@server ~]# touch /test/2048.dat [root@server ~]# touch /test/4096.DAT [root@server ~]# touch /test/test.sh [root@server ~]# chmod 755 /test/test.sh
作成したファイルを確認します。
[root@server ~]# ls -l /test/* -rw-r--r--. 1 root root 0 12月 21 19:06 /test/1024.dat -rw-r--r--. 1 root root 0 12月 21 19:06 /test/2048.dat -rw-r--r--. 1 root root 0 12月 21 19:06 /test/4096.DAT -rwxr-xr-x. 1 root root 0 12月 21 19:06 /test/test.sh
9.2 否定で絞り込む方法(!)
1024.dat以外のファイルを検索してみます。
[root@server ~]# find /test ! -name "1024.dat" /test /test/2048.dat /test/4096.DAT /test/test.sh
拡張子がdat以外のファイルを検索してみます。
[root@server ~]# find /test ! -name "*.dat" /test /test/4096.DAT /test/test.sh
9.3 or条件で絞り込む方法(-o)
拡張子がdatまたはshのファイルを検索してみます。
[root@server ~]# find /test -name "*.dat" -o -name "*.sh" /test/1024.dat /test/2048.dat /test/test.sh
拡張子がdatまたはDATのファイルを検索してみます。
[root@server ~]# find /test -name "*.dat" -o -name "*.DAT" /test/1024.dat /test/2048.dat /test/4096.DAT
9.4 and条件で絞り込む方法(-a)
拡張子がsh、かつ、1日以内のタイムスタンプのファイルを検索してみます。
[root@server ~]# find /test -name "*.sh" -a -mtime -1 /test/test.sh
拡張子がsh、かつ、1日以前のタイムスタンプのファイルを検索してみます。
[root@server ~]# find /test -name "*.sh" -a -mtime +1 [root@server ~]#
10 検索するディレクトリの深さを指定する方法
10.1 事前準備
テスト用のファイルを作成します。
[root@server ~]# mkdir -p /test1/test2/test3/ [root@server ~]# touch /test1/test1.dat [root@server ~]# touch /test1/test2/test2.dat [root@server ~]# touch /test1/test2/test3/test3.dat
作成したファイルを確認してみます。
[root@server ~]# ls -lR /test1 /test1: 合計 0 -rw-r--r--. 1 root root 0 12月 21 19:11 test1.dat drwxr-xr-x. 3 root root 36 12月 21 19:11 test2 /test1/test2: 合計 0 -rw-r--r--. 1 root root 0 12月 21 19:11 test2.dat drwxr-xr-x. 2 root root 23 12月 21 19:11 test3 /test1/test2/test3: 合計 0 -rw-r--r--. 1 root root 0 12月 21 19:11 test3.dat
10.2 指定したディレクトリの深さまで検索する方法(-maxdepth)
2つ下までのディレクリを検索してみます。
[root@server ~]# find /test1 -maxdepth 3 -name "*.dat" /test1/test2/test3/test3.dat /test1/test2/test2.dat /test1/test1.dat
次に、1つ下までのディレクリを検索してみます。
[root@server ~]# find /test1 -maxdepth 2 -name "*.dat" /test1/test2/test2.dat /test1/test1.dat
カレントディレクトリのファイルを検索してみます。
[root@server ~]# find /test1 -maxdepth 1 -name "*.dat" /test1/test1.dat
10.3 指定したディレクトリより深い位置の検索方法(-mindepth )
カレントディレクトリ配下のファイルを検索してみます。
[root@server ~]# find /test1 -mindepth 1 -name "*.dat" /test1/test2/test3/test3.dat /test1/test2/test2.dat /test1/test1.dat
1つ下のディレクトリ配下のファイルを検索してみます。
[root@server ~]# find /test1 -mindepth 2 -name "*.dat" /test1/test2/test3/test3.dat /test1/test2/test2.dat
2つ下のディレクトリ配下のファイルを検索してみます。
[root@server ~]# find /test1 -mindepth 3 -name "*.dat" /test1/test2/test3/test3.dat
3つ下のディレクトリ配下のファイルを検索してみます。
[root@server ~]# find /test1 -mindepth 4 -name "*.dat" [root@server ~]#
11 アクションの使い方
11.1 事前準備
テスト用のファイルを作成します。
[root@server ~]# mkdir /test [root@server ~]# fallocate -l 1024 /test/1024.dat [root@server ~]# fallocate -l 2048 /test/2048.dat [root@server ~]# fallocate -l 4096 /test/4096.DAT [root@server ~]# touch /test/zero.dat
作成したファイルを確認します。
[root@server ~]# ls --full-time /test 合計 12 -rw-r--r--. 1 root root 1024 2021-12-21 19:33:04.393812496 +0900 1024.dat -rw-r--r--. 1 root root 2048 2021-12-21 19:33:08.085837884 +0900 2048.dat -rw-r--r--. 1 root root 4096 2021-12-21 19:33:11.796863418 +0900 4096.DAT -rw-r--r--. 1 root root 0 2021-12-21 19:33:15.318887630 +0900 zero.dat
11.2 日時を表示する方法
拡張子がdatのファイルについて、日時を表示してみます。 %pはファイル名、%TY-%Tm-%Td %TH:%TM:%TSは日時、%Tzはタイムゾーンを表します。
[root@server ~]# find /test -name "*.dat" -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n" /test/1024.dat 2021-12-21 19:33:04.3938124960 +0900 /test/2048.dat 2021-12-21 19:33:08.0858378840 +0900 /test/zero.dat 2021-12-21 19:33:15.3188876300 +0900
11.3 サイズを表示する方法
%pはファイル名、%sはファイルサイズを表します。
[root@server ~]# find /test -name "*.dat" -printf "%p %s\n" /test/1024.dat 1024 /test/2048.dat 2048 /test/zero.dat 0
11.4 出力形式の使い方(-ls)
検索で見つけたファイルをls -dilsと同じ形式で表示します。
[root@server ~]# ls -dils /test/* 44057723 4 -rw-r--r--. 1 root root 1024 12月 21 19:33 /test/1024.dat 44057724 4 -rw-r--r--. 1 root root 2048 12月 21 19:33 /test/2048.dat 44057725 4 -rw-r--r--. 1 root root 4096 12月 21 19:33 /test/4096.DAT 44057726 0 -rw-r--r--. 1 root root 0 12月 21 19:33 /test/zero.dat
拡張子がdatのファイルについて、ls -dilsと同じ形式で表示してみます。
[root@server ~]# find /test -name "*.dat" -ls 44057723 4 -rw-r--r-- 1 root root 1024 12月 21 19:33 /test/1024.dat 44057724 4 -rw-r--r-- 1 root root 2048 12月 21 19:33 /test/2048.dat 44057726 0 -rw-r--r-- 1 root root 0 12月 21 19:33 /test/zero.dat
11.5 ファイルを削除する方法(-delete)
サイズが0のファイルを削除してみます。
[root@server ~]# find /test -empty -delete
ファイルを確認してみます。サイズが0のファイルが削除されたことがわかります。
[root@server ~]# ls -l /test/* -rw-r--r--. 1 root root 1024 12月 21 19:33 /test/1024.dat -rw-r--r--. 1 root root 2048 12月 21 19:33 /test/2048.dat -rw-r--r--. 1 root root 4096 12月 21 19:33 /test/4096.DAT
11.6見つけたファイルに対してコマンドを実行する方法(-exec)
テスト用ファイルのパーミッションを確認します。
[root@server ~]# ls -l /test/* -rw-r--r--. 1 root root 1024 12月 21 19:33 /test/1024.dat -rw-r--r--. 1 root root 2048 12月 21 19:33 /test/2048.dat -rw-r--r--. 1 root root 4096 12月 21 19:33 /test/4096.DAT
拡張子がdatまたはDATのファイルについて、実行権を644から444に変更してみます。 {}は引数、最後は;を指定します。;をメタキャラと解釈されないように\でエスケープします。
[root@server ~]# find /test -iname "*.dat" -exec chmod 444 {} \;
ファイルのパーミッションを確認します。 パーミッションが644から444に変更されたことがわかります。
[root@server ~]# ls -l /test/* -r--r--r--. 1 root root 1024 12月 21 19:33 /test/1024.dat -r--r--r--. 1 root root 2048 12月 21 19:33 /test/2048.dat -r--r--r--. 1 root root 4096 12月 21 19:33 /test/4096.DAT
12 特殊なファイルアクセス権(setuid,setgid,stickyビット)を持ったファイルの検索方法
12.1 setuidがセットされたファイルの検索方法
[root@server ~]# find /usr/bin -perm /4000 -ls 50559807 32 -rwsr-xr-x 1 root root 32096 10月 31 2018 /usr/bin/fusermount 50787905 44 -rwsr-xr-x 1 root root 41936 8月 9 2019 /usr/bin/newgrp -snip-
12.2 setgidがセットされたファイルの検索方法
[root@server ~]# find /usr/bin -perm /2000 -ls 50555809 16 -r-xr-sr-x 1 root tty 15344 6月 10 2014 /usr/bin/wall 50873740 20 -rwxr-sr-x 1 root tty 19544 10月 1 2020 /usr/bin/write -snip-
12.3 stickyビットがセットされたファイルの検索方法
[root@server ~]# find /tmp -perm /1000 -ls 16777288 4 drwxrwxrwt 11 root root 4096 12月 21 19:23 /tmp 16879979 0 drwxrwxrwt 2 root root 6 11月 9 20:26 /tmp/.XIM-unix -snip-
13 条件に合致したファイルを削除する方法(-delete)
13.1 事前準備
ファイルを3つ作成します。 なお、以下の{a..c}はbashのブレース展開という機能を使っています。
[root@server ~]# mkdir /test [root@server ~]# touch /test/{a..c}.txt
作成したファイルを確認します。
[root@server ~]# ls /test/*.txt /test/a.txt /test/b.txt /test/c.txt
13.2 条件に合致したファイルの削除
a.txtファイルを削除します。
[root@server ~]# find /test -name a.txt -delete
ファイルを確認します。a.txtファイルが削除されたことがわかります。
[root@server ~]# ls /test/*.txt /test/b.txt /test/c.txt
次に、b.txtファイルを削除します。
[root@server ~]# find /test -name b.txt -delete
ファイルを確認します。b.txtファイルが削除されたことがわかります。
[root@server ~]# ls /test/*.txt /test/c.txt
最後にc.txtファイルを削除します。
[root@server ~]# find /test -name c.txt -delete
ファイルを確認します。c.txtファイルが削除されたことがわかります。
[root@server ~]# ls /test/*.txt ls: /test/*.txt にアクセスできません: そのようなファイルやディレクトリはありません
14 実行ファイルを見つける方法
14.1 事前準備
テスト用のファイルを作成します。
[root@server ~]# mkdir /test [root@server ~]# touch /test/file1 [root@server ~]# touch /test/file2 [root@server ~]# touch /test/file3 [root@server ~]# touch /test/file4 [root@server ~]# chmod 100 /test/file1 [root@server ~]# chmod 010 /test/file2 [root@server ~]# chmod 001 /test/file3
作成したファイルのパーミッションを確認します。 ファイルfile4以外は実行ファイルであることがわかります。
[root@server ~]# ls -l /test/ 合計 0 ---x------. 1 root root 0 12月 21 19:23 file1 ------x---. 1 root root 0 12月 21 19:23 file2 ---------x. 1 root root 0 12月 21 19:23 file3 -rw-r--r--. 1 root root 0 12月 21 19:23 file4
14.2 executableを使う方法
executableを使って、実行ファイルのみ検索してみます。
[root@server ~]# find /test/ -type f -executable /test/file1 /test/file2 /test/file3
14.3 permを使う方法
パーミッションが100のファイルを検索してみます。
[root@server ~]# find /test/ -type f -perm 100 /test/file1
パーミッションが010のファイルを検索してみます。
[root@server ~]# find /test/ -type f -perm 010 /test/file2
パーミッションが001のファイルを検索してみます。
[root@server ~]# find /test/ -type f -perm 001 /test/file3
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ