この文章では、ファイルシステム階層(FHS)標準、ディレクトリがそのように命名される理由、およびそれらが必要な理由について説明します。 PATH環境変数について説明し、whereis、find、locate(slocate)などのシステム内のファイルを検索するための基本的なコマンドを解析します。

Gentooの創設者によるLinuxの基本ナビゲーション:
パートI
- BASH:ナビゲーションの基本 (はじめに)
- ファイルとディレクトリを管理する
- リンクおよびファイルとディレクトリの削除
- グローブルックアップ (合計とリンク)
パートII
- 正規表現 (イントロ)
- フォルダーの割り当て、ファイル検索
- プロセス管理
- テキスト処理とリダイレクト
- カーネルモジュール (合計とリンク)
FHSおよびファイル検索
ファイルシステム階層標準
File System Hierarchy Standard(略してFHS)は、Linuxシステムのディレクトリスキームを定義するドキュメントです。 FHSは、ほとんどのディストリビューションで必要なものがすべて同じであるため、ディストリビューションに依存しないソフトウェア開発を簡素化するための一般的な概要を提供するように設計されています。 FHSは、次のディレクトリツリーを定義します(仕様から直接取得)。
- /(ルートディレクトリ)
- / boot(静的ブートローダーファイル)
- / dev(デバイスファイル)
- / etc(ホスト固有の構成ファイル)
- / lib(コア共有ライブラリとカーネルモジュール)
- / mnt(一時的なニーズのマウントポイント)
- / opt(追加のソフトウェアパッケージ)
- / sbin(メインシステムプログラム)
- / tmp(一時ファイル)
- / usr(二次階層)
- / var(可変データ)
FHSの2つの独立した分類
FHS仕様は、共有と非共有、および可変と静的の2つの独立したファイル分類の考え方に基づいています。 共有データは複数のホストに分散できます。 非共有のものはホスト固有です(構成ファイルなど)。 可変データは変更される場合があります。 staticは変更しません(システムのインストールとメンテナンスを除く)。
次の表は、4つの可能な組み合わせと、これらのカテゴリに分類されるディレクトリの例をまとめたものです。 繰り返しますが、この表は仕様から直接のものです。
+ ------------ + ----------------- + --------------- +
| | 共有| 不可分|
+ ------------ + ----------------- + --------------- +
| 静的| / usr | /など|
| | / opt | /ブート|
+ ------------ + ----------------- + --------------- +
| 可変| / var / mail | / var / run |
| | / var /スプール/ニュース| / var / lock |
+ ------------ + ----------------- + --------------- +
/ usrの二次階層
/ usr内には、ルートファイルシステムに非常によく似たセカンダリ階層があります。 マシンの電源を入れたときに/ usrが存在することは重要ではありません。共有ネットワークリソース(共有)またはCD-ROMにマウント(静的)することができます。 ほとんどのLinux構成では/ usr分離可能性を使用しませんが、ルートディレクトリのプライマリ階層と/ usrのセカンダリ階層を区別することの有用性を理解することは重要です。
これで、ファイルシステム階層の標準について説明しました。 ドキュメント自体はかなり読みやすいので、それを見てみるべきです。 これを読んだ後、Linuxファイルシステムについての理解が深まります。 仕様は、 http : //www.pathname.com/fhs/にあります 。
ファイル検索
Linuxシステムには多くの場合、数十万のファイルが含まれています。 あなたはそれらのいずれかを見失うことはないほど十分に賢い可能性がありますが、時にはあなたがファイルを見つけるために助けを必要とする可能性がはるかに高いです。 これには、Linuxで使用できるいくつかの異なるツールがあります。 この概要は、ニーズに最適なものを選択するのに役立ちます。
パス
コマンドラインからプログラムを起動すると、bashは、指定したプログラムを検索してディレクトリのリストの検索を開始します。 たとえば、 lsと入力した場合、bashはlsプログラムが/ usr / binにあることを実際には知りません。 代わりに、PATHと呼ばれる環境変数を参照します。これには、コロンで区切られたディレクトリのリストが含まれます。 PATH値を確認できます。
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin.
このPATH値を使用すると(異なる場合があります)、bashは最初に/ usr / local / binディレクトリをチェックし、次にlsプログラムを検索して/ usr / binをチェックします。 ほとんどの場合、lsは/ usr / binにあり、bashはこのディレクトリでの検索を停止します。
パス変更
コマンドラインで新しい値を割り当てることにより、PATH変数を拡張できます。
$ PATH=$PATH:~/bin
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/home/agriffis/bin
PATHから項目を削除することもできますが、コマンドで既存の$ PATHを参照できないため、これはそれほど簡単ではありません。 最適なオプションは、必要なものをPATHで単純に再指定することです。
$ PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:~/bin
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/agriffis/bin
シェルで実行されるプロセスでPATHの変更を使用できるようにするには、exportコマンドを使用してそれらを「エクスポート」する必要があります。
$ export PATH
「どの」チームについて
whichを使用して、PATHに特定のプログラムがあるかどうかを確認できます。 次の例では、システムのPATHディレクトリにセンスと呼ばれるプログラムはありません。
$ which sense
which: no sense in (/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin)
この例では、lsは正常に配置されています。
$ which ls
/usr/bin/ls
どの-a
最後に、-aフラグについて知っておく必要があります。これは、PATH内のプログラムのすべてのインスタンスを表示するものを指示します。
$ which -a ls
/usr/bin/ls
/bin/ls
どこですか
プログラムの場所だけでなく、プログラムに関する詳細情報が必要な場合は、whereisコマンドを使用できます。
$ whereis ls
ls: /bin/ls /usr/bin/ls /usr/share/man/man1/ls.1.gz
ここで、lsは/ binと/ usr / binという共有実行可能ファイルのある2つのディレクトリにあります。 さらに、/ usr / share / manにあるドキュメントがあると言われました。 これは、 man lsと入力すると表示されるmanページです。
whereisプログラムを使用して、ソースの場所とカスタム検索(マナ、ソース、またはバイナリがないファイルを検索する機能を意味する-約Per。)を見つけることができます。 検索の代替パスを指定することもできます。 詳細については、manページを参照してください。
見つける
findコマンドは、武器庫のもう1つの便利なツールです。 検索を使用すると、プログラムを検索するだけでなく、 さまざまな検索条件を使用して、任意のタイプのファイルを検索できます。 たとえば、ディレクトリ/ usr / share / docのREADMEというファイルを見てください。
$ find /usr/share/doc -name README
/usr/share/doc/ion-20010523/README
/usr/share/doc/bind-9.1.3-r6/dhcp-dynamic-dns-examples/README
/usr/share/doc/sane-1.0.5/README
検索とパターン
-name引数にglobテンプレートを使用できます。ただし、引用符またはバックスラッシュでエスケープすることを条件に(この方法では、コマンドにそのまま渡されます。 拡張子を持つすべてのREADMEファイルを検索しましょう。
$ find /usr/share/doc -name README\*
/usr/share/doc/iproute2-2.4.7/README.gz
/usr/share/doc/iproute2-2.4.7/README.iproute2+tc.gz
/usr/share/doc/iproute2-2.4.7/README.decnet.gz
/usr/share/doc/iproute2-2.4.7/examples/diffserv/README.gz
/usr/share/doc/pilot-link-0.9.6-r2/README.gz
/usr/share/doc/gnome-pilot-conduits-0.8/README.gz
/usr/share/doc/gimp-1.2.2/README.i18n.gz
/usr/share/doc/gimp-1.2.2/README.win32.gz
/usr/share/doc/gimp-1.2.2/README.gz
/usr/share/doc/gimp-1.2.2/README.perl.gz
[ 578 ]
検索で大文字と小文字を区別しない
もちろん、検索時に大文字と小文字を区別することはできません。
$ find /usr/share/doc -name '[Rr][Ee][Aa][Dd][Mm][Ee]*'
または、はるかに簡単です:
$ find /usr/share/doc -iname readme\*
ご覧のとおり、大文字と小文字を区別しない検索では、-inameオプションを使用できます。
検索および正規表現
正規表現に精通している場合は、-regexオプションを使用して、パターンに一致する名前のファイルを検索できます。 また、-iregexと呼ばれる-inameに似たオプションを使用すると、テンプレートで大文字と小文字を区別せずに検索できます。 例:
$ find /etc -iregex '.*xt.*'
/etc/X11/xkb/types/extra
/etc/X11/xkb/semantics/xtest
/etc/X11/xkb/compat/xtest
/etc/X11/app-defaults/XTerm
/etc/X11/app-defaults/XTerm-color
ただし、ほとんどのプログラムとは異なり、findでは正規表現をパスの一部だけでなくパス全体に指定する必要があります。 このため、テンプレートの最初と最後に置く価値があります。 単にxtをテンプレートとして使用するだけでは十分ではありません。
検索とファイルの種類
-typeオプションを使用すると、ファイルシステム内の特定のタイプのファイルを検索できます。 -typeの可能な引数は、b(ブロックデバイス)、c(キャラクターデバイス)、d(ディレクトリ)、p(名前付きパイプ)、f(通常ファイル)、l(シンボリックリンク)、およびs(ソケット)です。 たとえば、名前に文字列vimを含む/ usr / binでシンボリックリンクを検索します。
$ find /usr/bin -name '*vim*' -type l
/usr/bin/rvim
/usr/bin/vimdiff
/usr/bin/gvimdiff
findとmtimes
-mtimeオプションを使用すると、最後に変更された日付に基づいてファイルを検索できます。 mtime引数は24時間の期間の数であり、引数の前にプラス(「後」を意味する)またはマイナス(「前」を意味する)を示すのが最も便利です。 たとえば、次のシナリオを考えます。
$ ls -l ?
-rw
$ date
Tue Jan 7 18:14:52 EST 2003
過去24時間以内に変更されたファイルを見つけることができます。
$ find . -name \? -mtime -1
./a
または、現在の24時間前に変更されたファイル:
$ find . -name \? -mtime +0
./b
./c
./d
-Daystartオプション
オプションで-daystartオプションを指定した場合、期間は現在の時刻ではなく、今日の初めからカウントされます。 たとえば、昨日と前日作成されたファイルは次のとおりです。
$ find . -name \? -daystart -mtime +0 -mtime -3
./b
./c
$ ls -lbc
-rw------- 1 root root 0 May 6 18:00 b -rw------- 1 root root 0 May 5 18:00 c
-サイズオプション
-sizeオプションを使用すると、サイズでファイルを検索できます。 デフォルトでは、-size引数は512バイトブロックの数ですが、オプションにサフィックスを追加することにより、結論をより理解しやすくすることができます。 使用可能なサフィックスは、b(512バイトブロック)、c(バイト)、k(キロバイト)、およびw(2バイトワード)です。 さらに、引数の前にプラス(「より大きい」)またはマイナス(「より小さい」)を指定できます。
たとえば、サイズが50バイト未満の通常のファイルを/ usr / binで検索するには:
$ find /usr/bin -type f -size -50c
/usr/bin/krdb
/usr/bin/run-nautilus
/usr/bin/sgmlwhich
/usr/bin/muttbug
見つかったファイルを操作する
見つかったファイルで何ができるのか想像もできません! したがって、findは、-execオプションを使用してファイルに対して任意のアクションを実行できます。 このオプションは、;で終わるコマンドラインを実行し、{}のすべての出現箇所をファイル名に置き換えます。 これは例を使用して理解するのが最も簡単です。
$ find /usr/bin -type f -size -50c -exec ls -l '{}' ';'
-rwxr-xr-x 1 root root 27 Oct 28 07:13 /usr/bin/krdb -rwxr-xr-x 1 root root 35 Nov 28 18:26 /usr/bin/run-nautilus -rwxr-xr-x 1 root root 25 Oct 21 17:51 /usr/bin/sgmlwhich -rwxr-xr-x 1 root root 26 Sep 26 08:00 /usr/bin/muttbug
ご覧のとおり、findは非常に強力なチームです。 彼女は、UNIXとLinuxの長年の開発で「成長」しました。 Findには他にも多くの便利なオプションがあります。 それらについては、manページで読むことができます。
見つける
which、whereis、findについては既に説明しました。 既にお気づきのように、検索には時間がかかる場合があります。 検索が実行されるすべてのディレクトリを読み取る必要があります。 Locateコマンドは、updatedbによって生成された外部データベースを使用してプロセスを高速化できることがわかりました(updatedbについては後述します)。
Locateコマンドは、ファイル自体だけでなく、パスの任意の部分で一致するものを探します。 例:
$ locate bin/ls
/var/ftp/bin/ls
/bin/ls
/sbin/lsmod
/sbin/lspci
/usr/bin/lsattr
/usr/bin/lspgpot
/usr/sbin/lsof
updatedbの使用
多くのLinuxシステムには、データベースを定期的に更新するためのcronジョブがあります。 ロケートコールが以下で説明するエラーを返した場合、ルートからupdatedbを実行して検索データベースを生成する必要があります。
$ locate bin/ls
locate: /var/spool/locate/locatedb: No such file or directory
$ su -
Password:
# updatedb
updatedbプログラムには時間がかかる場合があります。 ノイズの多いハードドライブがある場合、ファイルシステムのインデックス作成中にカサカサと音がします。 :)
配置する
多くのLinuxディストリビューションでは、locateユーティリティはslocateに置き換えられています。 原則として、検索するリンクもあるので、システムに正確に何があるかを覚えておく必要はありません。 slocateは「安全な位置特定」を意味します(英語から。安全な位置特定-約per。)。 アクセス権に関する情報を検索データベースに保存するため、通常のユーザーは表示できないディレクトリを表示できません。 locateは、locateと同じようにslocateによって使用されますが、プログラムの出力は、それを開始したユーザーによって異なる場合があります。
翻訳はDmitry Minsky (Dmitry.Minsky@gmail.com)によって行われました
継続するには...
著者について
ダニエル・ロビンス
Daniel Robbinsは、Gentooコミュニティの創設者であり、Gentoo Linuxオペレーティングシステムの作成者です。 ダニエルは妻のメアリーと元気な娘2人とニューメキシコに住んでいます。 彼はFuntooの創設者兼代表でもあり、 IBM developerWorks 、Intel Developer Services、およびC / C ++ Users Journalの技術記事を数多く執筆しています。
クリス・ハウザー
クリス・ハウザーは、1994年にテイラー大学(米国インディアナ州)の管理者チームに参加し、コンピューターサイエンスと数学の学士号を取得して以来、UNIXの支持者でした。 その後、Webアプリケーション、ビデオ編集、UNIXドライバー、暗号化保護など、さまざまな分野で働きました。 現在、Sentry Data Systemsで働いています。 Chrisは、Gentoo LinuxやClojureなどの多くの無料プロジェクトにも貢献し、 The Joy of Clojureの共同執筆者でもあります。
アロン・グリフィス
Iron Griffisはボストンに住んでおり、過去10年間、Hewlett-PackardでTru64、Linux、Xen、およびKVM仮想化セキュリティ認証用のUNIXネットワークドライバー、そして最近ではHP ePrintプラットフォームなどのプロジェクトに従事しました。 プログラミングの暇な時間に、Ayronは、自転車に乗ったり、ビットをジャグリングしたり、ボストンのプロ野球チームRed Socksを応援したりする際に、プログラミングの問題を消し去ることを好みます。