findコマンドで覚えておきたい使い方12個(+1個)

LinuxやUNIXで仕事をしていると、特定のファイル(名前だったり、さっき編集されたファイルだったり)がどこにあるのかを知りたい事が多々ある。
そんな時は、やはりfindコマンドの出番だ。今回は、そんなfindコマンドで覚えておきたい便利な使い方についてまとめてみる事にした。

1.ファイル名で検索する

まずは基本。findコマンドでは最も利用されているであろうファイル名での検索。
例えば、以下のように「-name」オプション付きでコマンドを実行することで、「test」というファイルが出力される。

このキーワードは、最下層(ディレクトリであれば一番下のディレクトリ、ファイルであればファイル名)にmatchしているかどうかで出力される。

find /探したいディレクトリ -name 検索キーワード

test@test-vm-ubuntu:~/.ssh$ find /home -name test
/home/test
/home/test/ruby-1.9.3-p392/test
/home/test/ruby-1.9.3-p392/test/rexml/data/test
/home/test/ruby-1.9.3-p392/lib/test
/home/test/ruby-1.9.3-p392/tool/test
/home/test/opam/_obuild/_mutable_tree/home/test
/home/test/opam/src_ext/cmdliner/test
/home/test/.npm/sntp/0.2.4/package/test
/home/test/.npm/boom/0.4.2/package/test
/home/test/.npm/ipaddr.js/0.1.5/package/test
/home/test/.npm/minimatch/0.2.14/package/test
/home/test/.npm/glob/3.2.3/package/test
/home/test/.npm/qs/2.3.3/package/test
/home/test/.npm/sigmund/1.0.0/package/test
/home/test/.npm/pad/0.0.5/package/test
/home/test/.npm/bl/0.9.3/package/test
/home/test/.npm/hoek/0.9.1/package/test
/home/test/.npm/graceful-fs/2.0.3/package/test
/home/test/.npm/node-uuid/1.4.1/package/test
/home/test/.npm/hawk/1.1.1/package/test
/home/test/.npm/delayed-stream/0.0.5/package/test

特定の拡張子を持つファイルのみを出力したい場合は、拡張子の前にワイルドカードを用いる。

find /探したいディレクトリ -name *.拡張子

test@test-vm-ubuntu:~/.ssh$ find /home -name *.sh
/home/test/test4.sh
/home/test/ruby-1.9.3-p392/ext/digest/test.sh
/home/test/ranger-1.6.1/doc/examples/bash_automatic_cd.sh
/home/test/ranger-1.6.1/doc/examples/bash_subshell_notice.sh
/home/test/ranger-1.6.1/doc/examples/rifle_sxiv.sh
/home/test/ranger-1.6.1/doc/config/scope.sh
/home/test/ranger-1.6.1/ranger/data/scope.sh
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/data/scope.sh
/home/test/opam/.travis-ci.sh
/home/test/opam/tests/init-repo.sh
/home/test/opam/tests/test-TEST.sh
/home/test/opam/tests/packages/P1-2/build.sh
/home/test/opam/tests/packages/P1-1/build.sh
/home/test/opam/tests/packages/P4/build.sh
/home/test/opam/tests/packages/P2/build.sh
/home/test/opam/tests/packages/P3/build.sh
/home/test/opam/tests/packages/P5/build.sh

大文字、小文字を区別しない場合は、「-iname」オプションを用いる。

find /探したいディレクトリ -iname 検索キーワード

test@test-vm-ubuntu:~/.ssh$ find /home -iname test
/home/test
/home/test/TEST
/home/test/ruby-1.9.3-p392/test
/home/test/ruby-1.9.3-p392/test/rexml/data/test
/home/test/ruby-1.9.3-p392/Test
/home/test/ruby-1.9.3-p392/lib/test
/home/test/ruby-1.9.3-p392/tool/test
/home/test/opam/_obuild/_mutable_tree/home/test
/home/test/opam/src_ext/cmdliner/test
/home/test/.npm/sntp/0.2.4/package/test
/home/test/.npm/boom/0.4.2/package/test
/home/test/.npm/ipaddr.js/0.1.5/package/test
/home/test/.npm/minimatch/0.2.14/package/test
/home/test/.npm/glob/3.2.3/package/test
/home/test/.npm/qs/2.3.3/package/test
/home/test/.npm/sigmund/1.0.0/package/test
/home/test/.npm/pad/0.0.5/package/test
/home/test/.npm/bl/0.9.3/package/test
/home/test/.npm/hoek/0.9.1/package/test
/home/test/.npm/graceful-fs/2.0.3/package/test
/home/test/.npm/node-uuid/1.4.1/package/test
/home/test/.npm/hawk/1.1.1/package/test
/home/test/.npm/delayed-stream/0.0.5/package/test
/home/test/.npm/minimist/0.0.8/package/test
/home/test/.npm/lru-cache/2.5.0/package/test

検索するファイル名に正規表現を利用したい場合は、「regex」オプションを利用する。
なお、このオプションの場合検索対象が「ファイル名」ではなく、PATH全体になる点に注意。

find /探したいディレクトリ -regex 検索キーワード(正規表現)

[root@localhost ~]# find /etc -regex .*.d/conf.*
/etc/httpd/conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/etc/pam.d/config-util

なお、こちらも大文字・小文字を区別させないで検索する場合は、「iregex」オプションを利用する。

2016/07/10 追記

なお、このとき「キーワード*」のようにアスタリスクをつけて検索した場合、「find: パス名は評価式の前に置かなければいけません」というようなエラーが出ることがある。

[root@BS-PUB-CENT7-01 ~]# ls -la /tmp/test*
-rw-r--r--. 1 root root 564  7月  2 13:11 /tmp/test.pl
-rw-r--r--. 1 root root 282  7月  2 07:30 /tmp/test1.py
-rw-r--r--. 1 root root  25  6月 21 08:53 /tmp/test123
-rw-r--r--. 1 root root  85  6月 25 17:40 /tmp/test1234
-rw-r--r--. 1 root root 126  7月  2 07:12 /tmp/test1234.txt
-rw-r--r--. 1 root root  26  7月  3 14:18 /tmp/test123_2
-rw-r--r--. 1 root root  25  7月  3 14:18 /tmp/test123_3
-rw-r--r--. 1 root root   0  6月 25 06:50 /tmp/test2
[root@BS-PUB-CENT7-01 ~]# find /tmp -name test*
find: パス名は評価式の前に置かなければいけません: test.frames.json
使用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

その場合は、キーワードを「"(ダブルクォーテーション)」で囲んでやるとよいだろう。

[root@BS-PUB-CENT7-01 ~]# find /tmp -name "test*"
/tmp/test123
/tmp/test123_2
/tmp/test123_3
/tmp/test2
/tmp/test1234
/tmp/test1.py
/tmp/test1234.txt
/tmp/test.pl

2.ディレクトリのみ、ファイルのみを出力させる

findコマンドでは、ディレクトリのみ、ファイルのみといった種類別に出力させるように指定することもできる。
「type」オプション後、出力させたいタイプを指定する。

find /探したいディレクトリ -type タイプ

選択できるタイプは以下の通りだ。

  • b … ブロックデバイス
  • c … キャラクタデバイス
  • d … ディレクトリ
  • p … 名前付きパイプ
  • f … ファイル
  • l … シンボリックリンク
  • s … ソケット
  • D … door(Solarisのみ)

3.サイズで検索する

findコマンドでは、ブロックサイズ・ファイルサイズで検索する事ができる。
ブロックサイズ・ファイルサイズの検索方法の違いは、サイズの末尾にcをつければファイルサイズ、何も付けない場合はブロックサイズになる。

●ブロックサイズ

find /探したいディレクトリ -size サイズ

●ファイルサイズ

find /探したいディレクトリ -size サイズc

上記の指定方法だと、ファイルサイズぴったりのものしか出力されない。
指定した数字を超えるサイズのものを出力する場合は数字の前に+を、未満のものを出力する場合は-を付与する。

●指定した数字を超えるサイズのものを出力する

find /探したいディレクトリ -size +サイズ

●指定した数字未満のサイズのものを出力する

find /探したいディレクトリ -size -サイズ

実際の数字(100)を例にすると、以下のようになる。

●100を超えるサイズ(101~)のものを出力する

find /探したいディレクトリ -size +100

●100未満(~99)のサイズのものを出力する

find /探したいディレクトリ -size -100
なお、サイズの指定方法ではM(メガバイト)、G(ギガバイト)といった単位を利用することもできる。

4.空ファイル・空ディレクトリを検索する

空ファイル、空ディレクトリのみを検索する場合は、「-empty」を付与する。

find /探したいディレクトリ -empty

5.◯分、◯日前にアクセス・修正されたファイルやディレクトリを検索する

◯分、◯日前にアクセスされたり、修正、ファイルステータスが変更されたファイルを探す事も出来る。

アクセス日時を基準にする場合

アクセス日時を基準にする場合、◯分前であれば「amin」、◯日前であれば「atime」を用いる。

●◯分前にアクセスされたファイルのみ出力する

find /探したいディレクトリ -amin ◯分

●◯日前にアクセスされたファイルのみ出力する

find /探したいディレクトリ -atime ◯日

ファイルステータス変更日時を基準にする場合

ファイルステータスの変更日時を基準にする場合、◯分前であれば「cmin」、◯日前であれば「ctime」を用いる。

●◯分前にファイルステータスが変更されたファイルのみ出力する

find /探したいディレクトリ -cmin ◯分

●◯日前にファイルステータスが変更されたファイルのみ出力する

find /探したいディレクトリ -ctime ◯日

ファイルの内容が変更された日時を基準にする場合

ファイルの内容が変更された日時を基準にする場合、◯分前であれば「mmin」、◯日前であれば「mtime」を用いる。

●◯分前にファイルの内容が変更されたファイルのみ出力する

find /探したいディレクトリ -mmin ◯分

●◯日前にファイルの内容が変更されたファイルのみ出力する

find /探したいディレクトリ -mtime ◯日

こちらもファイルサイズ・ブロックサイズでの検索と同様、◯日を超えて前・◯日未満での指定方法が出来る。
使い方も同じで、数字の頭に+、-を付け加えるだけだ。

●7日以上前に修正されたファイルを表示する場合

find /探したいディレクトリ -mtime +6

●7日以内にアクセスされたファイルを表示する場合

find /探したいディレクトリ -atime -8

また、特定のファイルと比較して、タイムスタンプが新しいファイルを出力させることも可能だ。
この場合、「-newer」オプションを利用する。

find /探したいディレクトリ -newer タイムスタンプを比較するファイル

指定したファイルよりより古いタイムスタンプのものを出力する場合は、「-newer」の前に「!」を付与する。

find /探したいディレクトリ ! -newer タイムスタンプを比較するファイル

test@test-vm-ubuntu:~$ ls -la test.aaaaa
-rw------- 1 test test 32  1月 19 00:40 test.aaaaa
test@test-vm-ubuntu:~$ sudo find /work -newer test.aaaaa -ls
660262    4 drwxrwxrwx   5 root     root         4096  2月 22 12:41 /work
679938    4 drwxr-xr-x   3 test     test         4096  2月 22 12:41 /work/work
679939    4 drwxr-xr-x   5 test     test         4096  2月 22 12:41 /work/work/test
677667    4 -rw-r--r--   1 test     test           87  2月 22 12:41 /work/work/test/test2.txt
679941    4 drwxr-xr-x   2 test     test         4096  2月 22 12:41 /work/work/test/test-20141207
677668    4 -rw-r--r--   1 test     test          100  2月 22 12:41 /work/work/test/test2.sh
679940    4 drwxr-xr-x   2 test     test         4096  2月 22 12:41 /work/work/test/20141207
677665    4 -rw-------   1 test     test          150  2月 22 12:41 /work/work/test/20141207/messages
664500    4 -rw-r--r--   1 test     test           34  2月 22 12:41 /work/work/test/test.txt
677666    4 -rw-r--r--   1 test     test           75  2月 22 12:41 /work/work/test/test.sh
679942    4 drwxr-xr-x   2 test     test         4096  2月 22 12:41 /work/work/test/test1-20141207
679698    4 drwxrwxr-x   6 test     test         4096  2月 26 23:23 /work/test
679846    4 -rw-rw-r--   1 test     test           87  2月 22 12:41 /work/test/test2.txt
679943    4 drwxr-xr-x   2 test     test         4096  2月 22 12:41 /work/test/test-20141207
678350    4 -rw-rw-r--   1 test     test           75  2月 24 20:46 /work/test/test1.sh
679853    4 -rw-rw-r--   1 test     test           90  2月 22 12:41 /work/test/test2.sh
679985    4 drwxrwxr-x   2 test     test         4096  2月 22 12:41 /work/test/20141207
677669    4 -rw-------   1 test     test          150  2月 22 12:41 /work/test/20141207/messages
678349    4 -rw-rw-r--   1 test     test           76  2月 24 20:46 /work/test/test1_.sh
679847    4 -rw-rw-r--   1 test     test           34  2月 22 12:41 /work/test/test.txt
679849    4 -rw-rw-r--   1 test     test           75  2月 22 12:41 /work/test/test.sh
679944    4 drwxr-xr-x   2 test     test         4096  2月 22 12:41 /work/test/test1-20141207
677670    4 -rw-r--r--   1 test     test           27  2月 22 12:41 /work/test_text
test@test-vm-ubuntu:~$ sudo find /work ! -newer test.aaaaa -ls
679845    4 drwxrwxr-x   2 test     test         4096 11月 16 18:46 /work/test_
679851    4 -rw-rw-r--   1 test     test           87 11月 16 18:46 /work/test_/test.txt
679850    4 -rw-rw-r--   1 test     test          132 11月 16 18:45 /work/test_/test.sh
679857    4 drwxr-xr-x   2 test     test         4096  1月 26  2012 /work/test/previous
679901 11916 -rwxr-xr-x   1 test     test     12199214  1月 26  2012 /work/test/previous/previous
679859  128 -rwxr-xr-x   1 test     test       131072  1月 26  2012 /work/test/previous/Rev_2.5_v66.BIN
679858   64 -rw-r--r--   1 test     test        65536  1月 26  2012 /work/test/previous/Rev_1.0_v41.BIN
679855    4 -rw-rw-r--   1 test     test           70 11月 17 01:17 /work/test/test4.sh
678347 2364 -rw-rw-r--   1 test     test      2417548  1月 27  2014 /work/test/winexe_1.00.1-1_amd64.deb
679854    4 -rw-rw-r--   1 test     test           90 11月 17 08:11 /work/test/test5.sh
679848    4 -rw-rw-r--   1 test     test           89 11月 17 01:05 /work/test/aaa.txt
679844 4028 -rw-rw-r--   1 test     test      4124182  2月 10  2014 /work/test/previous0.3.linux32.tar.gz
679856 4028 -rw-rw-r--   1 test     test      4124182  2月 10  2014 /work/test/previous0.3.linux32.tar.gz.1
679852    4 -rw-rw-r--   1 test     test           82 11月 17 01:11 /work/test/test3.sh

6.指定したパーミッションのファイル・ディレクトリを検索する

特定のパーミッションのファイルやディレクトリを探したい場合は、「-perm」オプションを利用する。

find /探したいディレクトリ -perm パーミッション

test@test-vm-ubuntu:~$ find /home -perm 777
/home/test/ruby-1.9.3-p392/libruby.so
/home/test/ruby-1.9.3-p392/libruby.so.1.9
/home/test/repo/oss/boot/i386/vmlinuz-xenpae
/home/test/repo/oss/boot/i386/branding
/home/test/repo/oss/boot/i386/initrd-xenpae
/home/test/repo/oss/boot/x86_64/branding
/home/test/ranger-1.6.1/doc/config/scope.sh
/home/test/ranger-1.6.1/doc/config/commands.py
/home/test/ranger-1.6.1/doc/config/rc.conf
/home/test/ranger-1.6.1/doc/config/colorschemes/jungle.py
/home/test/ranger-1.6.1/doc/config/colorschemes/snow.py
/home/test/ranger-1.6.1/doc/config/colorschemes/default.py
/home/test/ranger-1.6.1/doc/config/rifle.conf
/home/test/ranger-1.6.1/scripts/ranger
/home/test/ranger-1.6.1/scripts/rifle
/home/test/opam/src_ext/dose/doseparse/boilerplateNoRpm.ml
/home/test/360AnalyticsLtd/360-FAAR-v0.4.6/360-FAAR/360-faar.pl
/home/test/.ssh/id_rsa.pub
/home/test/.rainbow_config.json
/home/test/httpry/README
/home/test/httpry/scripts/perl-tools

644、777といった方法だけではなく、ユーザごと、グループごとに付与されている権限でも検索が可能だ。
以下の例は、ユーザに読み取り、書き込み権限があるものを検索している。

find /探したいディレクトリ -perm /u=rw

7.指定したユーザが保有しているファイル・ディレクトリを検索する

指定したユーザが保有しているファイルやディレクトリのみを出力したい場合は、「-user」オプションを付与する。

find /探したいディレクトリ -user ユーザ名

test@test-vm-ubuntu:~$ find /home/test -user root
/home/test/test4.sh
/home/test/finalterm/build/install_manifest.txt
/home/test/ranger-1.6.1/ranger/core/__init__.pyc
/home/test/ranger-1.6.1/ranger/core/main.pyc
/home/test/ranger-1.6.1/ranger/__init__.pyc
/home/test/ranger-1.6.1/build
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/data
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/data/mime.types
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/data/scope.sh
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/__init__.py
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container/__init__.py
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container/file.py
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container/tags.py
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container/history.py
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container/bookmarks.py
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container/directory.py
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container/settings.py
/home/test/ranger-1.6.1/build/lib.linux-x86_64-2.7/ranger/container/fsobject.py

ユーザ名だけではなく、グループ名でも検索を行う事が出来る。
グループ名で検索を行う場合は、「-group」オプションを用いる。

find /探したいディレクトリ -group グループ名

test@test-vm-ubuntu:~$ sudo find /etc -group vnstat
/etc/vnstat.conf

8.検索結果に対し別コマンドを実行する

findコマンドでは、検索結果に対して別のコマンドを実行することも出来る。
以下のように記述する。

find /探したいディレクトリ -exec 実行したいコマンド {} ;

test@test-vm-ubuntu:~$ find $PWD -name "test*.sh" -ls
166386    4 -rw-r--r--   1 root     root          272  6月  1  2014 /home/test/test4.sh
419854    4 -rw-r--r--   1 test     test          596 10月  2  2009 /home/test/ruby-1.9.3-p392/ext/digest/test.sh
164273    4 -rwxrwxr-x   1 test     test          131  9月  6  2014 /home/test/opam/tests/test-TEST.sh
317809    4 -rw-r--r--   1 test     test          100  2月  7 23:26 /home/test/work/work/work/test/test2.sh
304065    4 -rw-r--r--   1 test     test           75 11月 16 15:42 /home/test/work/work/work/test/test.sh
297146    4 -rw-r--r--   1 test     test           90 11月 16 18:41 /home/test/work/work/test/test2.sh
272077    4 -rw-r--r--   1 test     test           75 11月 16 15:42 /home/test/work/work/test/test.sh
271078    4 -rw-r--r--   1 test     test           90 11月 16 18:41 /home/test/work/test/test2.sh
271020    4 -rw-r--r--   1 test     test           75 11月 16 15:42 /home/test/work/test/test.sh
169291    4 -rw-r--r--   1 test     test          599  6月  1  2014 /home/test/test1.sh
164699    4 -rw-r--r--   1 test     test          379  6月  1  2014 /home/test/test2.sh
166381    4 -rw-r--r--   1 test     test          580  6月  1  2014 /home/test/test3.sh
165998    4 -rw-r--r--   1 root     root           81  2月 12 01:05 /home/test/test.sh
test@test-vm-ubuntu:~$ find $PWD -name "test*.sh" -exec chmod 777 {} \;
chmod: `/home/test/test4.sh' のパーミッションを変更しています: 許可されていない操作です
chmod: `/home/test/test.sh' のパーミッションを変更しています: 許可されていない操作です
test@test-vm-ubuntu:~$ find $PWD -name "test*.sh" -ls
166386    4 -rw-r--r--   1 root     root          272  6月  1  2014 /home/test/test4.sh
419854    4 -rwxrwxrwx   1 test     test          596 10月  2  2009 /home/test/ruby-1.9.3-p392/ext/digest/test.sh
164273    4 -rwxrwxrwx   1 test     test          131  9月  6  2014 /home/test/opam/tests/test-TEST.sh
317809    4 -rwxrwxrwx   1 test     test          100  2月  7 23:26 /home/test/work/work/work/test/test2.sh
304065    4 -rwxrwxrwx   1 test     test           75 11月 16 15:42 /home/test/work/work/work/test/test.sh
297146    4 -rwxrwxrwx   1 test     test           90 11月 16 18:41 /home/test/work/work/test/test2.sh
272077    4 -rwxrwxrwx   1 test     test           75 11月 16 15:42 /home/test/work/work/test/test.sh
271078    4 -rwxrwxrwx   1 test     test           90 11月 16 18:41 /home/test/work/test/test2.sh
271020    4 -rwxrwxrwx   1 test     test           75 11月 16 15:42 /home/test/work/test/test.sh
169291    4 -rwxrwxrwx   1 test     test          599  6月  1  2014 /home/test/test1.sh
164699    4 -rwxrwxrwx   1 test     test          379  6月  1  2014 /home/test/test2.sh
166381    4 -rwxrwxrwx   1 test     test          580  6月  1  2014 /home/test/test3.sh
165998    4 -rw-r--r--   1 root     root           81  2月 12 01:05 /home/test/test.sh

なお、execのかわりに「-ok」を利用する事で、そのコマンドを本当に実行していいか対話形式で進める事が可能となる。
解答はyかnで行う。

find /探したいディレクトリ -ok 実行したいコマンド {} ;

test@test-vm-ubuntu:~$ find $PWD -name "test*.sh" -ls
166386    4 -rw-r--r--   1 root     root          272  6月  1  2014 /home/test/test4.sh
419854    4 -rwxrwxrwx   1 test     test          596 10月  2  2009 /home/test/ruby-1.9.3-p392/ext/digest/test.sh
164273    4 -rwxrwxrwx   1 test     test          131  9月  6  2014 /home/test/opam/tests/test-TEST.sh
317809    4 -rwxrwxrwx   1 test     test          100  2月  7 23:26 /home/test/work/work/work/test/test2.sh
304065    4 -rwxrwxrwx   1 test     test           75 11月 16 15:42 /home/test/work/work/work/test/test.sh
297146    4 -rwxrwxrwx   1 test     test           90 11月 16 18:41 /home/test/work/work/test/test2.sh
272077    4 -rwxrwxrwx   1 test     test           75 11月 16 15:42 /home/test/work/work/test/test.sh
271078    4 -rwxrwxrwx   1 test     test           90 11月 16 18:41 /home/test/work/test/test2.sh
271020    4 -rwxrwxrwx   1 test     test           75 11月 16 15:42 /home/test/work/test/test.sh
169291    4 -rwxrwxrwx   1 test     test          599  6月  1  2014 /home/test/test1.sh
164699    4 -rwxrwxrwx   1 test     test          379  6月  1  2014 /home/test/test2.sh
166381    4 -rwxrwxrwx   1 test     test          580  6月  1  2014 /home/test/test3.sh
165998    4 -rw-r--r--   1 root     root           81  2月 12 01:05 /home/test/test.sh
test@test-vm-ubuntu:~$ sudo find $PWD -name "test*.sh" -ok chown puppet.puppet {} \;
< chown ... /home/test/test4.sh > ? y
< chown ... /home/test/ruby-1.9.3-p392/ext/digest/test.sh > ? y
< chown ... /home/test/opam/tests/test-TEST.sh > ? y
< chown ... /home/test/work/work/work/test/test2.sh > ? y
< chown ... /home/test/work/work/work/test/test.sh > ? y
< chown ... /home/test/work/work/test/test2.sh > ? y
< chown ... /home/test/work/work/test/test.sh > ? y
< chown ... /home/test/work/test/test2.sh > ? y
< chown ... /home/test/work/test/test.sh > ? y
< chown ... /home/test/test1.sh > ? y
< chown ... /home/test/test2.sh > ? y
< chown ... /home/test/test3.sh > ? y
< chown ... /home/test/test.sh > ? y
test@test-vm-ubuntu:~$ find $PWD -name "test*.sh" -ls
166386    4 -rw-r--r--   1 puppet   puppet        272  6月  1  2014 /home/test/test4.sh
419854    4 -rwxrwxrwx   1 puppet   puppet        596 10月  2  2009 /home/test/ruby-1.9.3-p392/ext/digest/test.sh
164273    4 -rwxrwxrwx   1 puppet   puppet        131  9月  6  2014 /home/test/opam/tests/test-TEST.sh
317809    4 -rwxrwxrwx   1 puppet   puppet        100  2月  7 23:26 /home/test/work/work/work/test/test2.sh
304065    4 -rwxrwxrwx   1 puppet   puppet         75 11月 16 15:42 /home/test/work/work/work/test/test.sh
297146    4 -rwxrwxrwx   1 puppet   puppet         90 11月 16 18:41 /home/test/work/work/test/test2.sh
272077    4 -rwxrwxrwx   1 puppet   puppet         75 11月 16 15:42 /home/test/work/work/test/test.sh
271078    4 -rwxrwxrwx   1 puppet   puppet         90 11月 16 18:41 /home/test/work/test/test2.sh
271020    4 -rwxrwxrwx   1 puppet   puppet         75 11月 16 15:42 /home/test/work/test/test.sh
169291    4 -rwxrwxrwx   1 puppet   puppet        599  6月  1  2014 /home/test/test1.sh
164699    4 -rwxrwxrwx   1 puppet   puppet        379  6月  1  2014 /home/test/test2.sh
166381    4 -rwxrwxrwx   1 puppet   puppet        580  6月  1  2014 /home/test/test3.sh
165998    4 -rw-r--r--   1 puppet   puppet         81  2月 12 01:05 /home/test/test.sh

9.lsコマンドに似たフォーマットで出力する

lsコマンドに類似したフォーマットで出力する場合は、末尾に「-ls」を付け加える。

find /探したいディレクトリ -ls

test@test-vm-ubuntu:~$ find $PWD -name "test*.sh" -ls
166386    4 -rw-r--r--   1 puppet   puppet        272  6月  1  2014 /home/test/test4.sh
419854    4 -rwxrwxrwx   1 puppet   puppet        596 10月  2  2009 /home/test/ruby-1.9.3-p392/ext/digest/test.sh
164273    4 -rwxrwxrwx   1 puppet   puppet        131  9月  6  2014 /home/test/opam/tests/test-TEST.sh
317809    4 -rwxrwxrwx   1 puppet   puppet        100  2月  7 23:26 /home/test/work/work/work/test/test2.sh
304065    4 -rwxrwxrwx   1 puppet   puppet         75 11月 16 15:42 /home/test/work/work/work/test/test.sh
297146    4 -rwxrwxrwx   1 puppet   puppet         90 11月 16 18:41 /home/test/work/work/test/test2.sh
272077    4 -rwxrwxrwx   1 puppet   puppet         75 11月 16 15:42 /home/test/work/work/test/test.sh
271078    4 -rwxrwxrwx   1 puppet   puppet         90 11月 16 18:41 /home/test/work/test/test2.sh
271020    4 -rwxrwxrwx   1 puppet   puppet         75 11月 16 15:42 /home/test/work/test/test.sh
169291    4 -rwxrwxrwx   1 puppet   puppet        599  6月  1  2014 /home/test/test1.sh
164699    4 -rwxrwxrwx   1 puppet   puppet        379  6月  1  2014 /home/test/test2.sh
166381    4 -rwxrwxrwx   1 puppet   puppet        580  6月  1  2014 /home/test/test3.sh
165998    4 -rw-r--r--   1 puppet   puppet         81  2月 12 01:05 /home/test/test.sh

10.出力させる階層を制限する

検索時、一定の階層以上深く検索させない事も可能だ。
下位の階層を検索対象としない場合は、「-maxdepth」オプションを利用する。

find /探したいディレクトリ -maxdepth 出力させたい階層数

test@test-vm-ubuntu:~$ find /work -type f
/work/test_/test.txt
/work/test_/test.sh
/work/work/test/test2.txt
/work/work/test/test2.sh
/work/work/test/20141207/messages
/work/work/test/test.txt
/work/work/test/test.sh
/work/test/previous/previous
/work/test/previous/Rev_2.5_v66.BIN
/work/test/previous/Rev_1.0_v41.BIN
/work/test/test2.txt
/work/test/test4.sh
/work/test/winexe_1.00.1-1_amd64.deb
/work/test/test5.sh
/work/test/aaa.txt
/work/test/previous0.3.linux32.tar.gz
/work/test/test1.sh
/work/test/test2.sh
/work/test/previous0.3.linux32.tar.gz.1
/work/test/20141207/messages
/work/test/test1_.sh
/work/test/test3.sh
/work/test/test.txt
/work/test/test.sh
/work/test_text
test@test-vm-ubuntu:~$ find /work -maxdepth 2 -type f
/work/test_/test.txt
/work/test_/test.sh
/work/test/test2.txt
/work/test/test4.sh
/work/test/winexe_1.00.1-1_amd64.deb
/work/test/test5.sh
/work/test/aaa.txt
/work/test/previous0.3.linux32.tar.gz
/work/test/test1.sh
/work/test/test2.sh
/work/test/previous0.3.linux32.tar.gz.1
/work/test/test1_.sh
/work/test/test3.sh
/work/test/test.txt
/work/test/test.sh
/work/test_text

逆に上位の階層を無視する場合は、「-mindepth」を用いる。

find /探したいディレクトリ -mindepth 出力させたい階層数

11.複数条件、複数ディレクトリで検索をする

findコマンドでは、複数条件、複数ディレクトリに対しての検索が出来る。

複数のディレクトリを検索する

複数のディレクトリに対して検索を行う場合、単純に複数ディレクトリを羅列するだけで行うことが出来る。

find /探したいディレクトリ1 /探したいディレクトリ2 ... 検索条件

test@test-vm-ubuntu:~$ find /home/test /work -name "test*.sh"
/home/test/test4.sh
/home/test/ruby-1.9.3-p392/ext/digest/test.sh
/home/test/opam/tests/test-TEST.sh
/home/test/work/work/work/test/test2.sh
/home/test/work/work/work/test/test.sh
/home/test/work/work/test/test2.sh
/home/test/work/work/test/test.sh
/home/test/work/test/test2.sh
/home/test/work/test/test.sh
/home/test/test1.sh
/home/test/test2.sh
/home/test/test3.sh
/home/test/test.sh
/work/test_/test.sh
/work/work/test/test2.sh
/work/work/test/test.sh
/work/test/test4.sh
/work/test/test5.sh
/work/test/test1.sh
/work/test/test2.sh
/work/test/test1_.sh
/work/test/test3.sh
/work/test/test.sh

複数の検索条件で検索する(and)

複数の条件を満たしたファイルを出力したい場合(and検索)の場合は簡単で、複数条件をただ記述すればいい。

find /探したいディレクトリ 条件1 条件2 ...

test@test-vm-ubuntu:~$ find /home/test -type f -name "*test*.sh" -mtime -30
/home/test/work/work/work/test/test2.sh
/home/test/test.sh

複数の検索条件で検索する(or)

or検索を行う場合は、「-or」で条件同士を繋げる。

find /探したいディレクトリ 条件1 -or 条件2 ...

and条件をorで繋げる事も可能だ。
以下のようにすることで、条件1と2を満たすものおよび条件3と4を満たすものを出力できる。

find /探したいディレクトリ 条件1 条件2 -or 条件3 条件4

test@test-vm-ubuntu:~$ find /home/test -type f -name "*test*.sh" -or -type d -mtime -1
/home/test/test4.sh
/home/test/ruby-1.9.3-p392/ext/digest/test.sh
/home/test/opam/tests/test-TEST.sh
/home/test/work/work/work/test/test2.sh
/home/test/work/work/work/test/test.sh
/home/test/work/work/test/test2.sh
/home/test/work/work/test/test.sh
/home/test/work/test/test2.sh
/home/test/work/test/test.sh
/home/test/test1.sh
/home/test/test2.sh
/home/test/test3.sh
/home/test/test.sh
/home/test/.cache/logrotate
/home/test/.cache/upstart
/home/test/.config/dconf

12.特定条件を検索結果から除外する

特定の条件を検索結果から除外したい場合は、検索条件の前に「!」を入れておけばいい。

find /探したいディレクトリ ! 除外したい条件

複数の条件を除外したい場合は、それぞれの条件前に「!」を入れる。

find /探したいディレクトリ ! 除外したい条件1 ! 除外したい条件2

test@test-vm-ubuntu:~$ find /home/test -type f -name "*test*.sh"
/home/test/test4.sh
/home/test/ruby-1.9.3-p392/ext/digest/test.sh
/home/test/opam/tests/test-TEST.sh
/home/test/work/work/work/test/test2.sh
/home/test/work/work/work/test/test.sh
/home/test/work/work/test/test2.sh
/home/test/work/work/test/test.sh
/home/test/work/test/test2.sh
/home/test/work/test/test.sh
/home/test/test1.sh
/home/test/test2.sh
/home/test/test3.sh
/home/test/test.sh
test@test-vm-ubuntu:~$ find /home/test -type f -name "*test*.sh" ! -name "test.sh" ! -name "test4.sh"
/home/test/opam/tests/test-TEST.sh
/home/test/work/work/work/test/test2.sh
/home/test/work/work/test/test2.sh
/home/test/work/test/test2.sh
/home/test/test1.sh
/home/test/test2.sh
/home/test/test3.sh

2016/05/02 追記

13.出力する項目を指定する

findコマンドでは、「-printf フォーマット」で出力する項目を明示的に指定することが出来る。
気をつけたいのが、これで出力フォーマットを指定する際、末尾に改行を含めてくれない。このため、フォーマットを指定する際に「\n」を末尾に付与するのを忘れないようにしたい。

以下、とりあえずよく使うだろう出力フォーマットのみ抜粋。
より細かい指定方法については、manを読んでもらいたい。

  • %p … ファイルPATH
  • %f … ファイル名
  • %s … ファイルサイズ(バイト)
  • %y … ファイルタイプ
  • %u … ファイルの所有者
  • %g … ファイルの所有グループ
  • %a … ファイルの最終アクセス日時
  • %t … ファイルの最終更新日時
  • %d … ファイルの深さ。0だと引数になる
[root@test-node vol.22]# find /opt/ShellGeiData/vol.22/ -type f -printf "%p\t%f\t%s\n"
/opt/ShellGeiData/vol.22/Q1/a   a       16
/opt/ShellGeiData/vol.22/Q1/b   b       18
/opt/ShellGeiData/vol.22/Q3     Q3      42
/opt/ShellGeiData/vol.22/Q3.ans Q3.ans  36
/opt/ShellGeiData/vol.22/Q4     Q4      80
/opt/ShellGeiData/vol.22/Q5     Q5      24
/opt/ShellGeiData/vol.22/Q6_1   Q6_1    455
/opt/ShellGeiData/vol.22/Q6_2   Q6_2    33
/opt/ShellGeiData/vol.22/Q7     Q7      0
/opt/ShellGeiData/vol.22/Q8.ans.cc      Q8.ans.cc       240
/opt/ShellGeiData/vol.22/Q8.cc  Q8.cc   205
/opt/ShellGeiData/vol.22/Q8_.cc Q8_.cc  240
/opt/ShellGeiData/vol.22/a.out  a.out   13880
[root@test-node vol.22]# find /opt/ShellGeiData/vol.22/ -type f | xargs ls -la
-rw-r--r--. 1 root root    16  5月  1 19:29 /opt/ShellGeiData/vol.22/Q1/a
-rw-r--r--. 1 root root    18  5月  1 19:29 /opt/ShellGeiData/vol.22/Q1/b
-rw-r--r--. 1 root root    42  5月  1 19:29 /opt/ShellGeiData/vol.22/Q3
-rw-r--r--. 1 root root    36  5月  1 19:29 /opt/ShellGeiData/vol.22/Q3.ans
-rw-r--r--. 1 root root    80  5月  1 19:29 /opt/ShellGeiData/vol.22/Q4
-rw-r--r--. 1 root root    24  5月  1 19:29 /opt/ShellGeiData/vol.22/Q5
-rw-r--r--. 1 root root   455  5月  1 19:29 /opt/ShellGeiData/vol.22/Q6_1
-rw-r--r--. 1 root root    33  5月  1 19:29 /opt/ShellGeiData/vol.22/Q6_2
-rw-r--r--. 1 root root     0  5月  1 19:29 /opt/ShellGeiData/vol.22/Q7
-rw-r--r--. 1 root root   240  5月  1 19:29 /opt/ShellGeiData/vol.22/Q8.ans.cc
-rw-r--r--. 1 root root   205  5月  1 23:59 /opt/ShellGeiData/vol.22/Q8.cc
-rw-r--r--. 1 root root   240  5月  2 00:00 /opt/ShellGeiData/vol.22/Q8_.cc
-rwxr-xr-x. 1 root root 13880  5月  2 00:04 /opt/ShellGeiData/vol.22/a.out