Linuxでファイルを検索するために検索と検索を使用する方法
序章
Linuxの操作方法を最初に学ぶときにユーザーが遭遇する問題の1つは、探しているファイルを見つける方法です。
このガイドでは、適切な名前の使用方法について説明します find 指図。 これは、さまざまなフィルターとパラメーターを使用してシステム上のファイルを検索するのに役立ちます。 また、簡単に説明します locate コマンド。別の方法でファイルを検索するために使用できます。
前提条件
このガイドに従うには、Linuxベースのオペレーティングシステムを実行しているコンピューターにアクセスする必要があります。 これは、SSHで接続した仮想プライベートサーバーまたはローカルマシンのいずれかです。 このチュートリアルは、Ubuntu 20.04を実行しているLinuxサーバーを使用して検証されていますが、示されている例は、任意のバージョンのLinuxディストリビューションを実行しているコンピューターで機能するはずです。
このガイドに従うためにリモートサーバーを使用する場合は、最初に初期サーバーセットアップガイドを完了することをお勧めします。 そうすることで、安全なサーバー環境がセットアップされます— root以外のユーザーを含む sudo 特権とUFWで構成されたファイアウォール—Linuxスキルを構築するために使用できます。
注:どのように 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 オプションですが、この例が示すように -and 2つの式を含めると必ず暗示されます。 または式のいずれかを満たす結果を返すこともできます。 -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 それぞれパラメータ。 内のすべてのファイルを検索するには /var syslog ユーザーが所有するディレクトリは、次のコマンドを実行します。
- find /var -user syslog
同様に、でファイルを指定できます /etc 次のように入力して、shadowグループが所有するディレクトリ。
- 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 ディレクトリ):
- 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 結果
次のすべてに対して任意のヘルパーコマンドを実行できます find を使用して一致します -exec 次の構文を使用するパラメータ:
- find find_parameters -exec command_and_options {} \;
The {} 次のファイルのプレースホルダーとして使用されます find 一致します。 The \; しましょう find コマンドがどこで終了するかを知っています。
たとえば、あなたがまだ test/ 内に作成したディレクトリ /tmp/ 前のステップのディレクトリでは、前のセクションのファイルを見つけることができます 644 権限を取得し、それらを変更して 664 権限:
- find . -type f -perm 644 -exec chmod 664 {} \;
同様の方法でディレクトリのアクセス許可を変更することもできます。
- find . -type d -perm 755 -exec chmod 700 {} \;
この例では、アクセス許可がに設定されているすべてのディレクトリを検索します 755 次に、権限を次のように変更します 700.
を使用してファイルを検索する locate
使用する代わりに find それは locate 指図。 このコマンドは多くの場合より高速で、ファイルシステム全体を簡単に検索できます。
コマンドはDebianまたはUbuntuにインストールできます。 apt パッケージリストを更新してから、 mlocate パッケージ:
- 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 呼び出し)、使用します -e 国旗:
- locate -e query
次の情報に関する統計を取得できます locate を使用してカタログ化されています -S オプション:
- 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.