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
.