Section Next | Prev


2.4.12 ファイルの検索(find)

【機能説明】
コマンド find は、 条件式で指定された条件にしたがってディレクトリを再帰的に 検索してファイルを探索します。

【入力フォーマット】
find ディレクトリ 条件式

【主なオプション】
-name file
ファイル名(file) の指定
シングル・クォートで囲めば、 * 、 ? 等のメタキャラクターを使うことができます。
-type c
ファイルタイプ(c)の指定。 ファイルタイプは次のうちのいずれか
cファイルタイプ
bブロック型デバイスファイル
cキャラクタ型デバイスファイル
dディレクトリ
p名前付きパイプ(FIFO)
f一般のファイル
lシンボリックリンク
sソケット

-user user_name/UID
ファイルの所有者の指定。ユーザ名か UID が使用できます。

-mtime [+-]n
-ctime [+-]n
-atime [+-]n
mtime は最新更新日付とシステム日付の差を指定。同様に atime はアクセス日付、 ctime は作成日付
+n は n 日前以前に、 n はちょうど n 日前に、 -n は n 日前より 後に修正されたファイルを指す。

-perm [+-]param
指定した属性のファイルを検索。

-o, -a
条件式の -o 論理和(or)と -a 論理積(and)

-exec cmd [ 引数 ] {} \;
条件と一致したファイルについて cmd で指定したコマンドを実行する。
コマンドはセミコロン(;)で終り、コマンド引数は{}で囲む。 ただしセミコロンは特殊文字であるためバックスラッシュ(\)で、打ち消す必要があり、 さらに {} とセミコロンの間には空白が必須。

-ok cmd [ 引数 ] {} \;
exec 同様にコマンドを行うが、実行される前に実行するか否かの確認をする。
y で応答した場合のみ cmd で指定したコマンド実行する。

-print
条件に一致したファイルのパス・ネームを表示する。
伝統的な UNIX ではこのオプションを指定しなければ何も表示されなかったが、 現在は省略時に採用このオプションが用いられている。

【実行例】
1. ファイル名が name で始まるファイルをカレント・ディレクトリから下に検索して、 ファイルが見つかったらそのパス・ネームを表示させる。
	$ find . -name 'name*' -print
	work/textdir/name.lis1
	work/textdir/name.lis2
	work/textdir/name.data
2. カレントディレクトリから、修正日付をもとにファイルを検索
	# テストデータ
	$ date
	Mon Oct  8 19:37:57 JST 2007	# 今日の日付 2007/10/08
	$ ls -lt
	total 0
	-rw-r--r--  1 ycos users 0 Oct  9  2007 data1009
	-rw-r--r--  1 ycos users 0 Oct  8 00:00 data1008
	-rw-r--r--  1 ycos users 0 Oct  7 00:00 data1007
	-rw-r--r--  1 ycos users 0 Oct  6 00:00 data1006
	-rw-r--r--  1 ycos users 0 Oct  5 00:00 data1005
	-rw-r--r--  1 ycos users 0 Oct  4 00:00 data1004
	-rw-r--r--  1 ycos users 0 Oct  3 00:00 data1003
	-rw-r--r--  1 ycos users 0 Oct  2 00:00 data1002
	-rw-r--r--  1 ycos users 0 Oct  1 00:00 data1001

	# 一昨日以前に修正されたファイルを検索
	$ find . -mtime +2 -type f -print
	./data1001
	./data1002
	./data1003
	./data1004
	./data1005

	# 4日前以降に修正されたファイルを検索
	$ find . -mtime -4 -type f -print
	./data1005
	./data1006
	./data1007
	./data1008
	./data1009
3. ファイル属性(参照可能、書き込み可能など)を指定したファイル検索
	# その他に読込権(004)がついているファイルの検出
	$ find /var/log -type f -perm +4 -print 2>/dev/null | head -5 
	/var/log/news/news.err
	/var/log/news/news.crit
	/var/log/news/news.notice
	/var/log/dmesg
	/var/log/Xorg.0.log
	$ ls -l /var/log/news/news.err
	-rw-rw-r--  1 news news 0 Apr 19  2005 /var/log/news/news.err

	$ find / -type d -perm +2 -print 2>/dev/null | head -5
	/var/lib/texmf
	/var/lock/xemacs
	/var/spool/samba
	/var/spool/vbox
	/var/tmp
	$ ls -ld /var/lib/texmf
	drwxrwxrwt  2 root root 4096 Aug  2 08:06 /var/lib/texmf

	$ find /usr/sbin -type f -perm 750 -print | head -3
	/usr/sbin/useradd
	/usr/sbin/userdel
	/usr/sbin/amrecover
	$ ls -l /usr/sbin/useradd
	-rwxr-x---  1 root root 61776 Oct 16  2006 /usr/sbin/useradd
4. カレント・ディレクトリから下のディレクトリで、ファイル名が .lis で終わるものと a.out のうち 3 日前以前に修正したファイルを、対話形式で削除する。
	$ find . \( -name a.out -o -name "*.lis" \) -mtime -3 -ok rm {} \;
	rm ./test.lis (yes) y
	rm ./a.out (yes)
	rm ./a.lis (yes)
上の例で、カッコ '()' はオプションの結合を行うために用います。 カッコ '()' 特殊文字としての機能を打ち消すバック・スラッシュ(\) を付加する必要があります。

5. 階層の指定 -maxdepth オプションで検索するディレクトリ階層の深さを指定できます。

	$ fine . -maxdepth 1 -name "*.bak"
	./Body241.html.bak
	./Body244.html.bak
	-maxdepth オプションは他のオプションよりも先に指定する必要があります。

Section Next | Prev

Copyright 2007-2018 ycosSystems GettingStart/Body24F.html