TOP - Unix系OS - Linux - find(1)

ファイルの検索を行います。

find オプション1 パス1 式1
オプション1(任意)
    シンボリックリンクに関する処理方法の指定などのオプション
    詳細はマニュアル等参照

パス1
    検索の対象となるディレクトリへのパス

式1
    検索の条件式
    ※値1は+を付けた際は値より大きい場合、-であれば値未満の場合、符号無しは一致の場合

        -amin 値1
            最終アクセス日時が(値1)分前であれば真

        -anewer ファイルパス1
            最終アクセス日時が(ファイルパス1)のファイルより新しければ真

        -atime 値1
            最終アクセス日時が(値1)日前であれば真

        -delete
            検索結果のファイルを消去

        -empty
            空ファイルの場合に真

        -exec コマンド1 ;
            (コマンド1)のコマンドを実行
            戻り値が0であれば真
            コマンドは検索結果のファイルを順次実行
            コマンド実行時のディレクトリはfindを実行したディレクトリ

        -exec コマンド1 {} +
            (コマンド1)のコマンドを実行
            戻り値が0であれば真
            検索結果のファイルをコマンドラインに追加して一括で実行(長さにより分割)
            コマンド実行時のディレクトリはfindを実行したディレクトリ

        -execdir コマンド1 ;
        -execdir コマンド1 {} +
            (コマンド1)のコマンドを実行
            戻り値が0であれば真
            コマンドは検索結果のファイルを順次実行
            ※「+」が付く場合も実行時の結果が同じくなる現象がみられる(2014/01/26現在)
            コマンド実行時のディレクトリは検索結果のファイルの存在するディレクトリ

        -executable
            実行可能ファイルか検索可能ディレクトリの場合に真

        -gid 値1
            ファイルのグループIDが(値1)であれば真

        -group 名前1
            ファイルのグループ名が(名前1)であれば真

        -ilname パターン1
            ファイルがシンボリックリンクでリンク先のパスが(パターン1)とマッチする場合に真
            大文字小文字を区別しない

        -iname パターン1
            ファイル名が(パターン1)とマッチする場合に真
            大文字小文字を区別しない

        -inum 値1
            ファイルのinode番号が(値1)であれば真

        -iregex パターン1
            ファイルパスが正規表現(パターン1)とマッチする場合に真
            大文字小文字を区別しない

        -links 値1
            ファイルのリンク数が(値1)であれば真

        -lname パターン1
            ファイルがシンボリックリンクでリンク先のパスが(パターン1)とマッチする場合に真

        -ls
            常に真
            ファイルの情報を標準出力に出力

        -name パターン1
            ファイル名が(パターン1)とマッチする場合に真

        -newer ファイルパス1
            更新日時が(ファイルパス1)のファイルより新しければ真

        -ok コマンド1 ;
            (コマンド1)のコマンドを実行
            実行前に確認メッセージが出力される。「y」を入力すると指定コマンドを実行
            確認メッセージで同意しない場合は偽を返す
            コマンドは検索結果のファイルを順次実行
            コマンド実行時のディレクトリはfindを実行したディレクトリ
            ※検索結果のファイルの存在するディレクトリでの実行は、okdirを使用

        -path パターン1
            ファイルパスが(パターン1)とマッチする場合に真

        -perm 値1
            (値1)で指定したモードビットとファイルのパーミッションが一致している場合に真

        -perm -値1
            (値1)で指定したモードのセットされている全てのビットがファイルでもセット
            されている場合に真

        -perm /値1
            (値1)で指定したモードのセットされているいずれかのビットがファイルでもセット
            されている場合に真

        -print
            常に真
            検索結果のファイルパスを標準出力に出力し、末尾に改行文字を付ける

        -print0
            常に真
            検索結果のファイルパスを標準出力に出力し、末尾にヌル文字を付ける

        -prune
            常に真
            指定したファイルがディレクトリの場合、そのディレクトリ以下には下りていかない

        -regex パターン1
            ファイルパスが正規表現(パターン1)とマッチする場合に真

        -samefile ファイルパス1
            ファイルが(値1)のファイルと同じinodeを参照している場合に真

        -size 値1文字1
            ファイルサイズが、(値1)ブロックであれば真
            ブロックサイズはデフォルトで512バイト
            (文字1)が指定されている場合のブロックサイズは以下の通り
                c    バイト
                b    512バイト(デフォルト)
                w    ワード(2バイト)
                k    キロバイト
                M    メガバイト
                G    ギガバイト

        -type 文字1
            ファイルが(文字1)で指定したファイルタイプと同じ場合に真
            ファイルタイプ(主なもの)
                d    ディレクトリ
                f    通常ファイル
                l    シンボリックリンク

        -user 名前1
            ファイルのユーザー名が(名前1)であれば真

※ オプションなどは個人的に重要と考えられるものを記述しており、記載の無いものは、manページや関連書籍などを参照願います。
※ 実行例の記述は、不要と考えられる部分の削除などの修正を行ったものを掲載しています。
※ 実行例の実行環境はUbuntu 12.10です。

例で使用するファイル情報
ファイルリスト
$ ls -l
total 16
-rwxr-xr-x 1 testuser2 testgroup2    6 Nov 17 14:54 test.sh
-rw-r--r-- 1 testuser2 testgroup1   15 Jan 23 08:57 test.txt
-rw-r--r-- 1 testuser1 testgroup1   10 Nov 17 14:56 test2.txt
-rw-rw-rw- 1 testuser1 testgroup2    0 Jan 23 08:38 test3.txt
lrwxrwxrwx 1 testuser1 testuser1     9 Jan 23 08:51 test4.txt -> test3.txt
drwxr-xr-x 2 testuser2 testgroup2 4096 Jan 22 19:25 testdir

$ ls -l testdir
total 4
-rw-r--r-- 1 testuser2 testgroup2 5 Jan 22 19:25 test.txt
詳細情報
$ stat test.sh    
  File: `test.sh'
  Size: 6             Blocks: 8          IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 4589495     Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1003/testuser2)   Gid: ( 1005/testgroup2)
Access: 2013-11-17 14:54:15.213415844 +0900
Modify: 2013-11-17 14:54:15.213415844 +0900
Change: 2013-11-17 15:44:29.288369497 +0900
 Birth: -

$ stat test.txt
  File: `test.txt'
  Size: 15            Blocks: 8          IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 4592066     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1003/testuser2)   Gid: ( 1004/testgroup1)
Access: 2014-01-23 08:57:14.016323740 +0900
Modify: 2014-01-23 08:57:14.016323740 +0900
Change: 2014-01-23 08:57:14.068325690 +0900
 Birth: -

$ stat test2.txt
  File: `test2.txt'
  Size: 10            Blocks: 8          IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 4589497     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1002/testuser1)   Gid: ( 1004/testgroup1)
Access: 2013-11-17 14:56:17.126027271 +0900
Modify: 2013-11-17 14:56:17.126027271 +0900
Change: 2013-11-17 15:44:54.792499949 +0900
 Birth: -

$ stat test3.txt
  File: `test3.txt'
  Size: 0             Blocks: 0          IO Block: 4096   regular empty file
Device: fc00h/64512d    Inode: 4592063     Links: 1
Access: (0666/-rw-rw-rw-)  Uid: ( 1002/testuser1)   Gid: ( 1005/testgroup2)
Access: 2014-01-23 08:38:30.478753270 +0900
Modify: 2014-01-23 08:38:30.478753270 +0900
Change: 2014-01-23 09:05:00.690626816 +0900
 Birth: -

$ stat test4.txt
  File: `test4.txt' -> `test3.txt'
  Size: 9             Blocks: 0          IO Block: 4096   symbolic link
Device: fc00h/64512d    Inode: 4589496     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1002/testuser1)   Gid: ( 1002/testuser1)
Access: 2014-01-23 08:51:08.658513911 +0900
Modify: 2014-01-23 08:51:06.314505886 +0900
Change: 2014-01-23 08:51:06.314505886 +0900
 Birth: -

$ stat testdir  
  File: `testdir'
  Size: 4096          Blocks: 8          IO Block: 4096   directory
Device: fc00h/64512d    Inode: 4589486     Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1003/testuser2)   Gid: ( 1005/testgroup2)
Access: 2014-01-22 19:25:05.422682400 +0900
Modify: 2014-01-22 19:25:02.730679787 +0900
Change: 2014-01-22 19:25:02.730679787 +0900
 Birth: -

$ stat testdir/test.txt
  File: `testdir/test.txt'
  Size: 5             Blocks: 8          IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 4592061     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1003/testuser2)   Gid: ( 1005/testgroup2)
Access: 2014-01-22 19:25:02.682680595 +0900
Modify: 2014-01-22 19:25:02.682680595 +0900
Change: 2014-01-22 19:25:54.950938984 +0900
 Birth: -

実行結果
$ find . -amin -60        ← 最終アクセス日時が現在時刻より60分未満のファイルを検索
.
./test3.txt
./test.txt
./test4.txt

$ find . -amin +60        ← 最終アクセス日時が現在時刻から60分を超えるファイルを検索
./test.sh
./test2.txt
./testdir
./testdir/test.txt

$ date
Thu Jan 23 09:14:15 JST 2014        ← 現在時刻

実行結果
$ find . -anewer test3.txt
.
./test.txt
./test4.txt

実行結果
$ find . -atime -1        ← 最終アクセス日時が現在時刻より1日未満のファイルを検索
.
./test3.txt
./test.txt
./test4.txt
./testdir
./testdir/test.txt

$ find . -atime +1        ← 最終アクセス日時が現在時刻より1日を超えるファイルを検索
./test.sh
./test2.txt

$ date
Thu Jan 23 09:21:07 JST 2014        ← 現在時刻

実行結果
$ ls -l
total 0
-rw-r--r-- 1 ******* ******* 0 Jan 25 09:03 test1.txt
-rw-r--r-- 1 ******* ******* 0 Jan 25 09:03 test2.txt
-rw-r--r-- 1 ******* ******* 0 Jan 25 09:03 test3.txt

$ find . -name "test1*" -delete    ← ※位置に注意。検索結果の後に設置

$ ls -l
total 0
-rw-r--r-- 1 ******* ******* 0 Jan 25 09:03 test2.txt
-rw-r--r-- 1 ******* ******* 0 Jan 25 09:03 test3.txt

実行結果
$ find . -empty   
./test3.txt

実行結果
$ find . -name "test*" -exec echo '{}' \;    ← {}はfindによって処理中のファイル名
./test3.txt
./test.sh
./test2.txt
./test.txt
./test4.txt
./testdir
./testdir/test.txt

実行結果
$ find . -name "test*" -exec echo '{}' \+    ← {}はfindによって処理中のファイル名
./test3.txt ./test.sh ./test2.txt ./test.txt ./test4.txt ./testdir ./testdir/test.txt

実行結果
$ find . -name "test*" -execdir echo '{}' \;
./test3.txt
./test.sh
./test2.txt
./test.txt
./test4.txt
./testdir
./test.txt

$ find . -name "test*" -execdir echo '{}' \+    ← 「+」を付けても同じ結果
./test3.txt
./test.sh
./test2.txt
./test.txt
./test4.txt
./testdir
./test.txt

実行結果
$ find . -executable
.
./test.sh
./testdir

実行結果
$ find . -gid 1004  
./test2.txt
./test.txt

実行結果
$ find . -group testgroup1
./test2.txt
./test.txt

実行結果
$ find . -ilname "Test*"                      
./test4.txt

実行結果
$ find . -iname "Test*"
./test3.txt
./test.sh
./test2.txt
./test.txt
./test4.txt
./testdir
./testdir/test.txt

実行結果
$ find . -inum 4589497
./test2.txt

実行結果
$ find . -iregex "\S*Test\w+\Wtxt"
./test3.txt
./test2.txt
./test4.txt

実行結果
$ find . -links 2
./testdir

実行結果
$ find . -lname "test*"
./test4.txt

実行結果
$ find . -name "test.txt" -ls
4592066    4 -rw-r--r--   1 testuser2 testgroup1       15 Jan 23 08:57 ./test.txt
4592061    4 -rw-r--r--   1 testuser2 testgroup2        5 Jan 22 19:25 ./testdir/test.txt

実行結果
$ find . -name "test*"    
./test3.txt
./test.sh
./test2.txt
./test.txt
./test4.txt
./testdir
./testdir/test.txt

実行結果
$ find . -newer test3.txt 
.
./test.txt
./test4.txt

実行結果
$ find . -name "test.txt" -ok echo '{}' \;
< echo ... ./test.txt > ? y          ← 確認メッセージde「y」を入力
./test.txt
< echo ... ./testdir/test.txt > ? y
./testdir/test.txt

実行結果
$ find . -path "*test*.txt"
./test3.txt
./test2.txt
./test.txt
./test4.txt
./testdir/test.txt

実行結果
$ find . -perm 644
./test2.txt
./test.txt
./testdir/test.txt

実行結果
$ find . -perm -755
.
./test.sh
./test4.txt
./testdir

実行結果
$ find . -perm /100
.
./test.sh
./test4.txt
./testdir

実行結果
$ find . -name "test*.txt" -print
./test3.txt
./test2.txt
./test.txt
./test4.txt
./testdir/test.txt

実行結果
$ find . -name "test*.txt" -print0
./test3.txt./test2.txt./test.txt./test4.txt./testdir/test.txt

実行結果
$ find . -name "testdir" -prune -o -print ← testdirという名前のファイルやディレクトリを除外
.
./test3.txt
./test.sh
./test2.txt
./test.txt
./test4.txt

実行結果
$ sudo ln test2.txt test5.txt
[sudo] password for *******:

$ ls -il
total 20
4589495 -rwxr-xr-x 1 testuser2 testgroup2    6 Nov 17 14:54 test.sh
4592066 -rw-r--r-- 1 testuser2 testgroup1   15 Jan 23 08:57 test.txt
4589497 -rw-r--r-- 2 testuser1 testgroup1   10 Nov 17 14:56 test2.txt
4592063 -rw-rw-rw- 1 testuser1 testgroup2    0 Jan 23 08:38 test3.txt
4589496 lrwxrwxrwx 1 testuser1 testuser1     9 Jan 23 08:51 test4.txt -> test3.txt
4589497 -rw-r--r-- 2 testuser1 testgroup1   10 Nov 17 14:56 test5.txt ← ハードリンク
4589486 drwxr-xr-x 2 testuser2 testgroup2 4096 Jan 22 19:25 testdir

$ find . -samefile test2.txt             
./test5.txt
./test2.txt

実行結果
$ find . -size 1         ← 1ブロック(512バイト)
./test.sh
./test2.txt
./test.txt
./test4.txt
./testdir/test.txt

$ find . -size 8         ← 8ブロック(4096バイト)
.
./testdir

$ find . -size 1k         ← 1キロバイト(1024バイト)
./test.sh
./test2.txt
./test.txt
./test4.txt
./testdir/test.txt

実行結果
$ find -type f           ← 通常ファイル
./test3.txt
./test.sh
./test2.txt
./test.txt
./testdir/test.txt

$ find -type l           ← シンボリックリンク
./test4.txt

実行結果
$ find . -user testuser1
./test3.txt
./test2.txt
./test4.txt

Copyright(C) 2006-2014 CLAYPOT. All Rights Reserved.