Linux でファイルを検索するための Find と Locate の使い方

author
2 minutes, 45 seconds Read

はじめに

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

  • k: Kilobytes

  • M: Megabytes

  • G: Gigabytes

  • b: 512-byte blocks

  • 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

以下のコマンドを実行して、この構造を作成する。lscd でディレクトリ構造をチェックし、どのように構成されているかを自由に把握することができる。 終了したら、テストディレクトリに戻ります:

  • 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

locatefind より速い理由は、ファイルシステム上のファイルのデータベースに依存しているためです。

データベースは通常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
Output
Database /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 のようなコマンドを使用してフィルタリングを試してみてください。

Similar Posts

コメントを残す

メールアドレスが公開されることはありません。