回答:
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*
(主な契約条件については、次をお読みください。詳細な印刷については、マニュアルをお読みください。)
ディレクトリの内容を一覧表示することは、の2番目の機能の一種ですls
。の主な仕事はls
、その複雑さの大部分を占めており、その表示を微調整することです。(コントロールこれは、両方の真である各ファイルに関する表示する情報とどのように表示がフォーマットされています。というオプションの数対表示するファイルを選択することに関連したオプションの数マニュアルを見て、比較GNUのlsのあなた」をLinux、および初期の頃からオプションの少ない他のシステムで見つかります。)
のデフォルトモードでls
は、ディレクトリを渡すと、そのディレクトリ内のファイルがリストされます。他の種類のファイル(通常のファイル、シンボリックリンクなど)を渡すと、そのファイルのみがリストされます。(これは、各引数に個別に適用されます。)このオプション-d
はls
、ディレクトリに降りないように指示します。
ls
-R
ディレクトリを再帰的に一覧表示するように指示するオプションはありません。ただし、適用範囲が限られているため、出力をあまりフィルタリングできません。
パターンマッチングを実行する最初のツールはシェル自体です。他のコマンドは必要ありません。ワイルドカードを入力するだけで設定は完了です。これは、グロビングと呼ばれます。
echo *filename*
従来、ワイルドカードは現在のディレクトリ(または指定されたディレクトリ:)に制限されていましたecho /some/where/*filename*
。Aは*
任意のファイル名またはファイル名の一部に*.txt
一致しfoo/bar.txt
ますが、には一致しません。最近のシェルは、**/
「このディレクトリ、またはその下の任意のディレクトリ(再帰的に)」を意味するパターンを追加しました。bashでは、歴史的な互換性の理由から、この機能を明示的に有効にする必要がありshopt -s globstar
ます(この行をに入れることができます~/.bashrc
)。
echo **/*filename*
このecho
コマンドは、シェルが生成したファイル名のリストを表示します。例外として、一致するファイル名がまったくない場合、ワイルドカードパターンはbashで変更されないままになり(設定しない限りshopt -s nullglob
、パターンは空のリストに展開されます)、zshはエラーを通知します(設定しない限りsetopt nullglob
、またはsetopt no_no_match
これにより、パターンは変更されません。
あなたはまだls
そのオプションのために使いたいかもしれません。たとえばls
、ファイルの性質や権限(ディレクトリ、実行可能ファイルなど)を色で示すことができます。でファイルの日付、サイズ、所有権を表示することができますls -l
。その他のオプションについては、マニュアルを参照してください。
ディレクトリツリーでファイルを検索する従来のコマンドはfind
です。表示するファイルとそれらをどうするかを制御する多くのオプションが付属しています。たとえば*filename*
、現在のディレクトリとそのサブディレクトリでパターンに一致する名前のファイルを探し、その名前を出力するには、次のように入力します。
find /some/dir -name '*filename*' -print
-print
アクションです(他のほとんどのアクションは、ファイルに対するコマンドの実行で構成されます)。あなたが行動を起こさないならば、-print
暗示されます。また、トラバースするディレクトリを指定しない場合(/some/dir
上記)、現在のディレクトリが暗示されます。条件-name '*filename'
は、名前がそのパターンに一致するファイルのみをリスト(または操作)することを示しています。-mtime -1
過去24時間に変更されたファイルに一致するなど、他にも多くのフィルターがあります。-name '*filename*'
ワイルドカードが現在のディレクトリ内のどのファイルとも一致しない場合のみ(上記を参照)、引用符を省略することもできます。全体として、短い形式は
find -name '*filename*'
ファイルの名前(の一部)がわかっている場合のもう1つの便利なツールはlocate
です。このツールは、ファイル名のデータベースを照会します。通常のシステムでは、毎晩更新されます。locate
以上の利点はfind /
、はるかに高速であることです。欠点は、その情報が古くなる可能性があることです。locate
マルチユーザーシステムでの動作が異なるいくつかの実装があります。基本的なlocate
プログラムは、公開されているファイルのみにインデックスを付けます(updatedb
アカウント内のすべてのファイルにインデックスを付ける2番目のデータベースを作成するためにコンパニオンを実行することもできます)。他のバージョン(mlocate、slocate)には、すべてのファイルにインデックスを付け、locate
プログラムにデータベースをフィルターさせて、表示できるファイルのみを返すようにするものがあります。
locate filename
ディストリビューション内のパッケージによってファイルが提供されていると思うことがあり、ファイルの名前(の一部)はわかっているがパッケージの名前はわかっていないため、パッケージをインストールしたい場合があります。多くのディストリビューションがそのためのツールを提供しています。Ubuntuではapt-file search filename
です。他のシステムでの同等のコマンドについては、Pacman Rosettaを確認してください。
あなたは何かしたい場合は、「速い」ではなく、ミッションクリティカルな状況で、あなたはそれが存在し、それがどこにあるか、あなたが使用できるかどうかを知りたいですlocate
。情報を収集するように指示したディレクトリにすべてのファイルのデータベースを保持します。
デフォルトのインストール(Ubuntu)では、ファイルシステムをスキャンしてデータベースを更新locate
する毎日のcron
ジョブを設定します...
あなたは、次のcron更新前の日付にデータベースを起動する必要があると感じた場合は、通常よりも高速であるfind
か、ls
単に実行するようにsudo updatedb
してからlocate
。より多くの検索を行う必要がある場合は、間違いなく高速です...その名前が示すように、使用updatedb
するデータベースを更新しますlocate
...
locate
正規表現が組み込まれているため、非常に便利です... find
スクリプトで使用find
しますが、コマンドラインではほとんど使用しません。私locate
は(個人的な)スクリプトでも使用します...例。locate -bir "oo.*datt.*mp4$"
locate
一致したファイルの完全修飾パスを返します。
find [path] -name [filename]
たとえば、/ homeディレクトリでfooを含むファイル名を検索するには、次のコマンドを使用します。
find /home -name *foo*
コマンドman find
を使用して、findコマンドと引数の詳細を確認します。
*
シェルがそれらを解釈しないようにするには、s を引用またはエスケープする必要があります。
ls
です?