Linuxでファイルを検索するために検索と検索を使用する方法

提供:Dev Guides
移動先:案内検索

序章

Linuxの操作方法を最初に学ぶときにユーザーが遭遇する問題の1つは、探しているファイルを見つける方法です。

このガイドでは、適切な名前のfindコマンドの使用方法について説明します。 これは、さまざまなフィルターとパラメーターを使用してシステム上のファイルを検索するのに役立ちます。 また、locateコマンドについても簡単に説明します。このコマンドを使用して、別の方法でファイルを検索できます。

前提条件

このガイドに従うには、Linuxベースのオペレーティングシステムを実行しているコンピューターにアクセスする必要があります。 これは、SSHで接続した仮想プライベートサーバーまたはローカルマシンのいずれかです。 このチュートリアルは、Ubuntu 20.04を実行しているLinuxサーバーを使用して検証されていますが、示されている例は、任意のバージョンのLinuxディストリビューションを実行しているコンピューターで機能するはずです。

このガイドに従うためにリモートサーバーを使用する場合は、最初に初期サーバーセットアップガイドを完了することをお勧めします。 そうすることで、sudo権限を持つroot 以外のユーザーや、UFWで構成されたファイアウォールなどの安全なサーバー環境がセットアップされます。これを使用してLinuxスキルを構築できます。

または、このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルのサンプルコマンドを試すこともできます。 次のインタラクティブターミナルの起動!ボタンをクリックしてターミナルウィンドウを開き、Linux(Ubuntu)環境での作業を開始します。

インタラクティブターミナルを起動します!

findおよびlocateコマンドの動作を説明するために、このガイドのコマンド例では、/またはの下に保存されているファイルを検索します。 ]ルートディレクトリ。 このため、 root 以外のユーザーとして端末にログインしている場合、一部のコマンド例では、出力にPermission deniedが含まれる場合があります。

通常のユーザーが通常アクセスできないディレクトリ内のファイルを検索しているため、これは予想されることです。 ただし、これらのサンプルコマンドは引き続き機能し、これらのプログラムがどのように機能するかを理解するのに役立ちます。


名前で検索

ファイルを検索する最も明白な方法は、名前によるものです。

findコマンドを使用して名前でファイルを検索するには、次の構文を使用します。

find -name "query"

これは大文字と小文字が区別されます。つまり、queryの検索はQueryの検索とは異なります。

名前でファイルを検索し、クエリの大文字と小文字を無視するには、-inameオプションを使用します。

find -iname "query"

特定のパターンに準拠していないすべてのファイルを検索する場合は、-notを使用して検索を逆にすることができます。

find -not -name "query_to_avoid"

または、次のように、感嘆符(!)を使用して検索を反転することもできます。

find \! -name "query_to_avoid"

!を使用する場合は、findが動作する前にシェルが文字を解釈しようとしないように、文字をバックスラッシュ(\)でエスケープする必要があります。

タイプによる検索

-typeパラメーターを使用して、検索するファイルのタイプを指定できます。 それはこのように動作します:

find -type type_descriptor query

ファイルの種類を指定するために使用できる記述子のいくつかを次に示します。

  • f:通常のファイル
  • d:ディレクトリ
  • l:シンボリックリンク
  • c:キャラクターデバイス
  • b:ブロックデバイス

たとえば、システム上のすべてのキャラクターデバイスを検索する場合は、次のコマンドを発行できます。

find /dev -type c

このコマンドは、特に/devディレクトリ(Linuxシステムでデバイスファイルが通常マウントされるディレクトリ)内のデバイスのみを検索します。

Output/dev/vcsa5
/dev/vcsu5
/dev/vcs5
/dev/vcsa4
/dev/vcsu4
/dev/vcs4
/dev/vcsa3
/dev/vcsu3
/dev/vcs3
/dev/vcsa2
/dev/vcsu2
/dev/vcs2
. . .

次のようなコマンドを使用して、.confで終わるすべてのファイルを検索できます。 この例では、/usrディレクトリ内で一致するファイルを検索します。

find /usr -type f -name "*.conf"
Output/usr/src/linux-headers-5.4.0-88-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-88-generic/include/config/tristate.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/tristate.conf
/usr/share/adduser/adduser.conf
/usr/share/ufw/ufw.conf
/usr/share/popularity-contest/default.conf
/usr/share/byobu/keybindings/tmux-screen-keys.conf
/usr/share/libc-bin/nsswitch.conf
/usr/share/rsyslog/50-default.conf
. . .

:前の例では、2つのfindクエリ式を組み合わせています。 つまり、-type f-name "*.conf"です。 返されるファイルは、これらの式の両方を満たす必要があります。

このような式は、-andオプションで区切ることで組み合わせることができますが、この例が示すように、2つの式を含めると-andが暗示されます。 -orオプションで区切ることにより、いずれかの式を満たす結果を返すこともできます。

find -name query_1 -or -name query_2

この例では、名前がquery_1またはquery_2のいずれかに一致するファイルを検索します。


時間とサイズによるフィルタリング

findは、サイズと時間で結果をフィルタリングするさまざまな方法を提供します。

サイズ

-sizeパラメーターを使用して、ファイルをサイズでフィルター処理できます。 これを行うには、数値サイズ値の最後に特別なサフィックスを追加して、サイズをバイト、メガバイト、ギガバイト、または別のサイズでカウントしているかどうかを示す必要があります。 一般的に使用されるサイズのサフィックスは次のとおりです。

  • c:バイト
  • k:キロバイト
  • M:メガバイト
  • G:ギガバイト
  • b:512バイトのブロック

説明のために、次のコマンドは、/usrディレクトリ内の正確に50バイトのすべてのファイルを検索します。

find /usr -size 50c

50バイト未満のファイルを検索するには、代わりに次の構文を使用できます。

find /usr -size -50c

/usrディレクトリで700メガバイトを超えるファイルを検索するには、次のコマンドを使用できます。

find /usr -size +700M

時間

Linuxは、システム上のすべてのファイルについて、アクセス時間、変更時間、および変更時間に関する時間データを保存します。

  • アクセス時間:ファイルが最後に読み取られた、または書き込まれた時間。
  • 変更時間:ファイルの内容が最後に変更された時刻。
  • 変更時間:ファイルのiノードメタデータが最後に変更された時刻。

find検索は、それぞれ-atime-mtime、および-ctimeオプションを使用して、これらのパラメーターに基づいて行うことができます。 これらのオプションのいずれについても、検索する過去の日数を示す値を渡す必要があります。 前に概説したサイズオプションと同様に、これらのオプションの前にプラス記号またはマイナス記号を付けて、「より大きい」または「より小さい」を指定できます。

たとえば、/usrディレクトリで、前日以内に変更されたファイルを見つけるには、次のコマンドを実行します。

find /usr -mtime 1

1日以内にアクセスされたファイルが必要な場合は、次のコマンドを実行できます。

find /usr -atime -1

3日以上前にメタ情報が最後に変更されたファイルを見つけるには、次のコマンドを実行します。

find /usr -ctime +3

これらのオプションには、日ではなく分を指定するために使用できるコンパニオンパラメーターもあります。

find /usr -mmin -1

これにより、直前に変更されたファイルが表示されます。

findは、参照ファイルとの比較を実行して、新しいファイルを返すこともできます。

find / -newer reference_file

この構文は、参照ファイルよりも最近作成または変更されたシステム上のすべてのファイルを返します。

所有者と権限による検索

-userおよび-groupパラメーターをそれぞれ使用して、ファイルを所有するユーザーまたはグループでファイルを検索することもできます。 syslog ユーザーが所有する/varディレクトリ内のすべてのファイルを検索するには、次のコマンドを実行します。

find /var -user syslog

同様に、次のように入力して、shadowグループが所有する/etcディレクトリ内のファイルを指定できます。

find /etc -group shadow

特定の権限を持つファイルを検索することもできます。

パーミッションの正確なセットを一致させたい場合は、8進表記を使用してパーミッションを指定する次の構文を使用できます。

find / -perm 644

これにより、指定された権限を持つファイルと正確に一致します。

少なくとものパーミッションで何かを指定する場合は、パーミッション表記の前にマイナス記号を付けることができます。

find / -perm -644

これは、追加の権限を持つすべてのファイルと一致します。 この場合、744のアクセス許可を持つファイルが照合されます。

深さによるフィルタリング

このセクションでは、ディレクトリ構造の例を作成します。この構造を使用して、構造内の深さでフィルタリングファイルを調べます。

このチュートリアルの例に従っている場合は、/tmp/ディレクトリ内にこれらのファイルとディレクトリを作成するのが賢明です。 /tmp/一時ディレクトリです。つまり、サーバーが次に起動したときに、その中のすべてのファイルとディレクトリが削除されます。 これは、後でシステムを詰まらせることを心配することなく、必要な数のディレクトリ、ファイル、およびリンクを作成できるため、このガイドの目的に役立ちます。

このセクションのコマンドを実行すると、/tmp/ディレクトリには3つのレベルのディレクトリが含まれ、最初のレベルには10のディレクトリが含まれます。 各ディレクトリ(一時ディレクトリを含む)には、10個のファイルと10個のサブディレクトリが含まれます。

次のコマンドを使用して、/tmp/ディレクトリ内にサンプルディレクトリ構造を作成します。

mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}

その後、touchコマンドを使用して、これらのディレクトリにいくつかのサンプルファイルを入力します。

touch /tmp/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}

これらのファイルとディレクトリを配置したら、先に進んで、作成したtest/ディレクトリに移動します。

cd /tmp/test

findがこの構造からファイルを取得する方法のベースラインを理解するには、file1という名前のファイルに一致する通常の名前検索から始めます。

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 -name file1 | wc -l
Output1111

これはおそらくあまりにも多くの結果であり、ほとんどの状況で役に立ちません。 絞り込むには、最上位の検索ディレクトリで検索の最大深度を指定できます。

find -maxdepth num -name query

file1level1ディレクトリ以上でのみ検索するには、最大深度を2に指定できます(最上位ディレクトリに1、level1ディレクトリに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 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
. . .

繰り返しますが、分岐ディレクトリ構造のため、これは多数の結果(1000)を返します。

最小深度パラメータと最大深度パラメータを組み合わせて、狭い範囲に焦点を合わせることができます。

find -mindepth 2 -maxdepth 3 -name file1
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
. . .

このようにこれらのオプションを組み合わせると、結果が大幅に絞り込まれ、以前の1000行ではなく110行のみが返されます。

findの結果でコマンドを実行する

次の構文を使用して-execパラメーターを使用することにより、findが一致するすべてに対して任意のヘルパーコマンドを実行できます。

find find_parameters -exec command_and_options {} \;

{}は、findが一致するファイルのプレースホルダーとして使用されます。 \;は、findにコマンドの終了位置を知らせます。

たとえば、前の手順で/tmp/ディレクトリ内に作成したtest/ディレクトリにいるとすると、前のセクションで644を含むファイルを見つけることができます。アクセス許可を変更し、664アクセス許可を持つように変更します。

find . -type f -perm 644 -exec chmod 664 {} \;

同様の方法でディレクトリのアクセス許可を変更することもできます。

find . -type d -perm 755 -exec chmod 700 {} \;

この例では、アクセス許可が755に設定されているすべてのディレクトリを検索し、アクセス許可を700に変更します。

locateを使用したファイルの検索

findを使用する代わりに、locateコマンドを使用することもできます。 このコマンドは多くの場合より高速で、ファイルシステム全体を簡単に検索できます。

パッケージリストを更新してからmlocateパッケージをインストールすることにより、aptを使用してDebianまたはUbuntuにコマンドをインストールできます。

sudo apt update
sudo apt install mlocate

Rocky Linux、CentOS、およびその他のRedHat派生ディストリビューションでは、代わりにdnfコマンドを使用してmlocateをインストールできます。

sudo dnf install mlocate

locatefindよりも高速である理由は、ファイルシステム上のすべてのファイルを一覧表示するデータベースに依存しているためです。 このデータベースは通常、cronスクリプトを使用して1日に1回更新されますが、updatedbコマンドを使用して手動で更新することもできます。 sudo権限でこのコマンドを今すぐ実行します。

sudo updatedb

新しいファイルを検索する場合は、locateデータベースが常に最新である必要があることを忘れないでください。 cronスクリプトを実行する前、またはupdatedbコマンドを実行する前に新しいファイルを追加すると、それらはクエリ結果に表示されません。

locateを使用すると、さまざまな方法で結果をフィルタリングできます。 これを使用してファイルを検索する最も基本的な方法は、次の構文を使用することです。

locate query

これは、ファイルパスのどこかに文字列queryを含むすべてのファイルとディレクトリに一致します。 名前にクエリ自体が含まれているファイルのみを返すには、その前のディレクトリにクエリがあるすべてのファイルではなく、-bフラグを含めて、「basename」がクエリに一致するファイルのみを検索できます。 :

locate -b query

locateがファイルシステムにまだ存在する結果(最後のupdatedb呼び出しと現在のlocate呼び出しの間に削除されなかったファイルを意味する)のみを返すようにするには、[X183X ] フラグ:

locate -e query

-Sオプションを使用して、locateがカタログ化した情報に関する統計を取得できます。

locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:
    21015 directories
    136787 files
    7727763 bytes in file names
    3264413 bytes used to store database

これは、システムに存在するファイルとディレクトリの数を高レベルで理解するのに役立ちます。

結論

findコマンドとlocateコマンドはどちらも、システム上のファイルを検索するための便利なツールです。 どちらも強力なコマンドであり、パイプラインを介して他のユーティリティと組み合わせることで強化できますが、特定の状況に適したツールを決定するのはあなた次第です。

ここから、findlocateの実験を続けることをお勧めします。 それぞれのmanページを読んで、このガイドでカバーされていない他のオプションについて学ぶことができます。また、検索結果をwcsortなどの他のコマンドにパイプすることで、検索結果を分析および操作できます。 ]、およびgrep