Linuxでファイルを検索するために検索と検索を使用する方法
序章
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
file1
をlevel1
ディレクトリ以上でのみ検索するには、最大深度を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
locate
がfind
よりも高速である理由は、ファイルシステム上のすべてのファイルを一覧表示するデータベースに依存しているためです。 このデータベースは通常、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
コマンドはどちらも、システム上のファイルを検索するための便利なツールです。 どちらも強力なコマンドであり、パイプラインを介して他のユーティリティと組み合わせることで強化できますが、特定の状況に適したツールを決定するのはあなた次第です。
ここから、find
とlocate
の実験を続けることをお勧めします。 それぞれのman
ページを読んで、このガイドでカバーされていない他のオプションについて学ぶことができます。また、検索結果をwc
、sort
などの他のコマンドにパイプすることで、検索結果を分析および操作できます。 ]、およびgrep
。