はじめに
Linux マシンを初めて扱うときにユーザーがぶつかる問題のひとつは、探しているファイルをどうやって見つけるか、です。 これは、さまざまなフィルタとパラメータを使用して、VPS 上のファイルを検索するのに役立ちます。
Finding by Name
ファイルを検索する最も明白な方法は、名前によるものです。
名前でファイルを検索するには、次のように入力します。
ファイル名で検索し、大文字と小文字を区別しない場合は、次のように入力します:
- find -iname "query"
特定のパターンに従わないすべてのファイルを検索したい場合は、-not
または !
で逆検索を行います。 !
を使用する場合、find が動作する前に bash がその文字を解釈しようとしないようにエスケープしなければならない:
- find -not -name "query_to_avoid"
Or
- find \! -name "query_to_avoid"
Finding by Type
-type
パラメータで見つけたいファイルの種類を指定することができる。 これは次のように動作します:
- find -type type_descriptor query
ファイルの種類を指定するために使用できる最も一般的な記述子を以下に示します:
-
f: regular file
-
d: directory
-
l: symbolic link
-
c: character devices
-
b: character devices
-
b.C:キャラクターデバイス
-
d:ファイル
例えば、システム上のすべてのキャラクタデバイスを見つけたい場合、次のコマンドを発行できます:
- find / -type c
Output/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .
このように .conf
で終わるすべてのファイルを検索することができます:
- find / -type f -name "*.conf"
Output/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .
時間とサイズによるフィルタリング
Find ではサイズと時間によって結果を絞り込む方法がいろいろと提供されています。
サイズ
パラメーター -size
を使用すると、サイズによってフィルタリングできます。 一般的なオプションは次のとおりです:
-
c: bytes
-
k: bytes
-
M: Megabytes
-
G: Gigabytes
-
b: 512-byte blocks
k: Kilobytes
- find / -size 50c
50バイト未満のすべてのファイルを探すために、この形式が代わりに使えるようになります。
- find / -size -50c
700メガバイト以上のすべてのファイルを検索するには、このコマンドを使用できます:
- find / -size +700M
Time
Linuxは、アクセス時間、修正時間、変更時間に関する時間データを保存します。
-
Access Time:
-
Modification Time: ファイルの読み取りまたは書き込みが行われた最後の時間。
-
Change Time: ファイルのコンテンツが変更された最後の時間。
これらは、-atime
、-mtime
、-ctime
パラメーターで使用することができます。 これらは、sizeと同様にプラスとマイナスの記号で大小を指定できます。
このパラメータの値は、何日前に検索したいかを指定します。
変更時刻が1日前のファイルを検索するには:
- find / -mtime 1
1日未満にアクセスされたファイルを取得するには:
- find / -atime -1
3日以上前にメタ情報が最後に変更されたファイルを取得するには: とタイプします。
- find / -ctime +3
また、日数ではなく分を指定するための付属パラメータもあります:
- find / -mmin -1
これは、最後の1分間でシステムのタイプが変更されたファイルを取得します。
- find / -newer myfile
Finding by Owner and Permissions
ファイルの所有者やグループの所有者によってもファイルを検索することができます。 syslog」ユーザーが所有するファイルを検索するには、次のように入力します:
- find / -user syslog
同様に、「shadow」グループが所有するファイルを指定するには、次のように入力します:
- find / -group shadow
また、特定のパーミッションを持つファイルを検索することも可能です。
パーミッションの正確なセットに一致させたい場合は、次の形式を使用します:
- find / -perm 644
これは、指定したパーミッションに正確に一致します。
少なくともこれらのパーミッションを持つものを指定したい場合は、次の形式を使用できます:
- find / -perm -644
これは追加パーミッションがあるすべてのファイルに一致させます。 7709>
Filtering by Depth
このセクションでは、一時ディレクトリの中にディレクトリ構造を作成します。 3階層のディレクトリを含み、第1階層に10個のディレクトリを配置します。
- cd
- mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
- touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
- cd ~/test
以下のコマンドを実行して、この構造を作成する。ls
と cd
でディレクトリ構造をチェックし、どのように構成されているかを自由に把握することができる。 終了したら、テストディレクトリに戻ります:
- cd ~/test
この構造から特定のファイルを返す方法について作業します。 まず、比較のために通常の名前検索だけの例で試してみましょう:
- find -name file1
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .
たくさんの結果がありますね。 出力をカウンタにパイプすると、合計で1111件の結果があることがわかります。
トップレベルの検索ディレクトリの下に検索の最大深度を指定できます:
- find -maxdepth num -name query
「レベル 1」ディレクトリ以上でのみ「file1」を検索するには、最大深度を 2 に指定できます(トップレベルのディレクトリに 1、レベル 1 ディレクトリに 1):
- find -maxdepth 2 -name file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
これではるかに管理しやすいリストとなりました。
また、すべてのファイルが現在のディレクトリの下のあるポイントを超えて存在することがわかっている場合、最小ディレクトリを指定できます:
- find -mindepth num -name query
これを使用して、ディレクトリ分岐の最後にあるファイルのみを検索できます:
- find -mindepth 4 -name file
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .
この場合も、ディレクトリ分岐構造のために、多数の結果 (1000) が返されます。
min と max depth パラメータを組み合わせて、狭い範囲に焦点を当てることができます:
- find -mindepth 2 -maxdepth 3 -name file
Output./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .
検索コマンドの実行と組み合わせ
-exec
パラメータを使って、検索がマッチしたすべてに対して任意のヘルパーコマンドを実行することができます。 これは次のように呼ばれる:
- find find_parameters -exec command_and_params {} \;
{}
はfind matchesするファイルのプレースホルダーとして使われる。
例えば、前のセクションで 644
パーミッションを持つファイルを見つけ、それらを 664
パーミッションに変更することができます:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
次に、次のようにディレクトリパーミッションを変更します:
- find . -type d -perm 755 -exec chmod 700 {} \;
異なる結果を連結したい場合、-and
または -or
コマンドを使用できます。
- find . -name file1 -or -name file9
Find Files Using Locate
find
の代わりに、locate
コマンドを使用することができます。 Debian や Ubuntu では apt
:
- sudo apt install mlocate
CentOS では dnf
:
- sudo dnf install mlocate
locate
が find
より速い理由は、ファイルシステム上のファイルのデータベースに依存しているためです。
データベースは通常1日に1回 cron スクリプトで更新されますが、次のコマンドを入力することで手動で更新できます:
- sudo updatedb
Run this command now.
Locate を使用してファイルを検索するには、次の構文を使用します:
- locate query
いくつかの方法で出力をフィルタリングすることができます。
たとえば、クエリを含むファイルのみを返すには、クエリにつながるディレクトリにあるすべてのファイルを返すのではなく、-b
を使用して「ベースネーム」のみを検索します:
- locate -b query
ファイルシステムにまだ存在する結果のみを返すには(最後の updatedb
コールから現在の locate
コールまでに削除されていない)、 -e
フラッグを使用してください。
- locate -e query
locate がカタログ化した情報の統計を見るには、 -S
オプションを使用する:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Conclusion
find と locate はどちらもシステム上のファイルを探す良い方法である。 7709>
find と locate は強力なコマンドであり、パイプラインを通して他のユーティリティと組み合わせることにより強化することができます。 wc
, sort
, grep
のようなコマンドを使用してフィルタリングを試してみてください。