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