ディレクトリ構造内のファイルを探すという基本的なことに加えて、findコマンドを使えば、コマンドラインに行くのがさらに簡単になるような便利な操作をいくつも実行することができます。
この記事では、初心者にもベテランにも便利な15のLinux findコマンドを紹介します。
まず、以下のサンプルfindコマンドをテストするために、ホームディレクトリの下に以下の空のファイルを作成します。
# vim create_sample_files.sh
touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c
mkdir backup
cd backup
touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c
# chmod +x create_sample_files.sh
# ./create_sample_files.sh
# ls -R
.:
backup MybashProgram.sh MyCProgram.c
create_sample_files.sh mycprogram.c Program.c
./backup:
MybashProgram.sh mycprogram.c MyCProgram.c Program.c
1.ファイル名で探す
これはfindコマンドの基本的な使い方です。次の例では、find名としてMyCProgram.cを使用して、カレント・ディレクトリとそのサブ・ディレクトリにあるファイルを検索しています。
# find -name "MyCProgram.c"
./backup/MyCProgram.c
./MyCProgram.c
2.大文字小文字を無視してファイル名でファイルを検索します。
これはfindコマンドの基本的な使い方です。次の例では、MyCProgram.cをfind名として、大文字小文字を無視して、カレントディレクトリとそのサブディレクトリにあるファイルを検索しています。
# find -iname "MyCProgram.c"
./mycprogram.c
./backup/mycprogram.c
./backup/MyCProgram.c
./MyCProgram.c
3.mindepthとmaxdepthを使用して、検索の深さを指定したディレクトリに制限します。
ルート・ディレクトリとそのサブディレクトリでpasswdファイルを探してください。
# find / -name passwd
./usr/share/doc/nss_ldap-253/pam.d/passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd
ルート・ディレクトリとその1階層下のサブディレク トリからpasswdを探してください。
# find -maxdepth 2 -name passwd
./etc/passwd
ルート・ディレクトリーとそのサブディレクトリー *** 2階層にあるpasswdファイルを探してください。
# find / -maxdepth 3 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd
第2階層サブディレクトリと第4階層サブディレクトリの間にある passwdファイルを探してください。
# find -mindepth 3 -maxdepth 5 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd
4.findコマンドで見つかったファイルに対してコマンドを実行します。
次の例では、findコマンドで「MyCProgram.c」という名前の大文字小文字を区別しないすべてのファイルのMD5検証合計を計算しています。は現在のファイル名に置き換えられます。
find -iname "MyCProgram.c" -exec md5sum {} \;
d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c
d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c
d41d8cd98f00b204e9800998ecf8427e ./backup/MyCProgram.c
d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c
5.逆マッチング
MyCProgram.c 以外の名前のファイルまたはディレクトリをすべて表示します。maxdepthが1なので、カレント・ディレクトリ内のファイルとディレクトリのみが表示されます。
find -maxdepth 1 -not -iname "MyCProgram.c"
.
./MybashProgram.sh
./create_sample_files.sh
./backup
./Program.c
6.inode番号を使ったファイルの検索
どのファイルにも *** inode 番号があり、それを使ってファイルを区別することができます。似たような名前のファイルを2つ作成します。例えば、1つは末尾にスペースがあり、もう1つはスペースがありません。
touch "test-file-name"
# touch "test-file-name "
[Note: There is a space at the end]
# ls -1 test*
test-file-name
test-file-name
lsの出力から、どのファイルの末尾がスペースであるかを見分けることはできません。iオプションを付けると、ファイルのinode番号が表示され、2つのファイルを区別することができます。
ls -i1 test*
16187429 test-file-name
16187430 test-file-name
以下のように、findコマンドでinode番号を指定することができます。ここでは、findコマンドはinode番号でファイル名を変更しています。
find -inum 16187430 -exec mv {} new-test-file-name \;
# ls -i1 *test*
16187430 new-test-file-name
16187429 test-file-name
このテクニックは、上のようなひどい名前のファイルをどうにかしたいときに使えます。例えば、file?.txtという名前のファイルには特殊文字が含まれています。rm file?.txt "と実行しようとすると、下に表示されている3つのファイルがすべて削除されてしまいます。そこで、以下の手順で「file?.txt」ファイルを削除してください。
ls
file1.txt file2.txt file?.txt
各ファイルのinode番号を検索します。
ls -i1
804178 file1.txt
804179 file2.txt
804180 file?.txt
以下に示すように、inode番号を使用して、特殊記号を含むファイル名を削除します。
find -inum 804180 -exec rm {} \;
# ls
file1.txt file2.txt
[Note: The file with name "file?.txt" is now removed]
7.パーミッションに従ったファイルの検索
以下の操作が合理的です:
指定したパーミッションのファイルを検索
他のパーミッションビットを無視し、指定されたパーミッションと一致するかどうかをチェックします。
指定された8進数/記号式に基づく権限の検索
この例では、ディレクトリに以下のファイルがあるとします。これらのファイルはパーミッションが異なることに注意してください。
ls -l
total 0
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
---------- 1 root root 0 2009-02-19 20:31 no_for_all
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
グループの読み取りパーミッションを持つファイルを検索します。次のコマンドを使用して、同じグループのユーザーに対して読み取りパーミッションが設定されている、カレントディレクトリ内のファイルを検索します。
find . -perm -g=r -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 0 2009-02-19 20:30 ./everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
-rw-r----- 1 root root 0 2009-02-19 20:27 ./others_can_also_read
グループユーザーに対して読み取り専用パーミッションが設定されているファイルを検索します。
find . -perm g=r -type f -exec ls -l {} \;
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
グループユーザーに対して読み取り専用パーミッションが設定されているファイルを検索します。
find . -perm 040 -type f -exec ls -l {} \;
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
8.ホームディレクトリとサブディレクトリ内のすべての空のファイルを検索します。
以下のコマンドの出力ファイルの大部分は、ファイルボックスをロックする他のプログラムによって作成されたプレースホルダーです。
find ~ -empty
ホームディレクトリにある空のファイルだけをリストアップします。
find . -maxdepth 1 -empty
現在の年のディレクトリにある、隠されていない空のファイルだけがリストされます。
find . -maxdepth 1 -empty -not -name ".*"
9.5つの***文書を検索
次のコマンドは、カレント・ディレクトリとサブディレクトリにある5つの***ファ イルを一覧表示します。このコマンドの処理に必要なファイルの数に応じて、少し時間がかかります。
find . -type f -exec ls -s {} \; | sort -n -r | head -5
10.最小の5つのファイルを検索
この方法は、5つの***ファイルを見つける方法と似ていますが、ソートの順序が降順である点が異なります。
find . -type f -exec ls -s {} \; | sort -n | head -5
上記のコマンドでは、空のファイルしか表示されない可能性が高いです。そのような場合は、以下のコマンドを使用すると、0バイトのファイルではなく、最小のファイルを一覧表示することができます。
find . -not -empty -type f -exec ls -s {} \; | sort -n | head -5
11.指定したファイル・タイプのファイルを検索するには、-typeを使用します。
ソケットファイルのみを検索します:
find . -type s
すべてのディレクトリを検索します:
find . -type d
すべての一般文書を検索します:
find . -type f
すべての隠しファイルを検索します:
find . -type f -name ".*"
すべての隠しディレクトリを検索します:
find -type d -name ".*"
12.他の文書との修正時間の比較による文書の検索
指定したファイルの後に変更が加えられたファイルを表示します。次の find コマンドは ordinary_file より後に作成されたすべてのファイルを表示します。
ls -lrt
total 0
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
---------- 1 root root 0 2009-02-19 20:31 no_for_all
# find -newer ordinary_file
.
./everybody_read
./all_for_all
./no_for_all
13.サイズによるファイルの検索
ファイルをサイズで検索するには、-size オプションを使用します。
指定したファイルより大きいファイルを検索します:
find ~ -size +100M
指定されたファイルより小さいファイルを検索します:
find ~ -size -100M
指定されたサイズに一致するファイルを検索します:
find ~ -size 100M
注:-は指定サイズより小さく、+は指定サイズより大きいことを意味します。記号なしは、指定されたサイズとまったく同じサイズであることを意味します。
14.一般的な検索操作のエイリアシング
便利なものを見つけたら、別名をつけることができます。そして、お好きなところに実装してください。
a.outファイルの削除によく使われます。
alias rmao="find . -iname a.out -exec rm {} \;"
# rmao
cプログラムによって生成されたコアファイルを削除します。
alias rmc="find . -iname core -exec rm {} \;"
# rmc
15.findコマンドによる大きなパッケージの削除
次のコマンドは、100M以上の*.zipファイルを削除します。
find / -type f -name *.zip -size +100M -exec rm -i {} \;"
100Mより大きい*.tarファイルをすべて削除するには、rm100mエイリアスを使用します。同じアイデアを使って、rm1g、rm2g、rm5gというエイリアスのクラスを作成し、1G、2G、5Gより大きいファイルをすべて削除することができます。
alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
# alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
# alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
# alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"
# rm100m
# rm1g
# rm2g
# rm5g
検索コマンドの例
findコマンドに関するママの記事を楽しんでいただけたなら、findコマンドに関するパパの記事のパート2をチェックするのをお忘れなく。





