hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

findコマンドの使い方

1. findコマンドとは

ファイルやディレクトリを検索するコマンドです。

2. 検証環境

VMware Workstation 15 Player上の仮想マシンを使っています。 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/vmware/guestServicePipe
/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バイトのファイルを作成します。

[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