web-dev-qa-db-ja.com

コマンドラインからファイルシステム内のファイルを見つける方法は?

(部分的に既知のファイル名を持つ)ファイルがファイルシステムのどこにあるのかを知りたいのですが。 GUIユーティリティを使用するのではなく、コマンドラインからこれを行う方法を知りたいです。

Windowsでは、次のコマンドを実行します。

cd /d C:\
dir *filename* /s

Linuxの同等機能は何ですか?

10
Iszi
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

(主な契約条件については、こちらをお読みください。詳細な印刷については、マニュアルをお読みください。)

ディレクトリの内容の一覧表示は、lsの2番目の機能の一種です。複雑さの大部分を占めるlsの主な仕事は、表示の微調整です。 (マニュアルを見て、表示するファイルの選択に関連するオプションの数と、各ファイルについて表示する情報を制御するオプションの数と表示のフォーマット方法を比較してください。これは GNUの両方に当てはまります。 ls Linuxで見つかります otherearly 日以降のオプションの少ないシステム)

lsのデフォルトモードでは、ディレクトリを渡すと、そのディレクトリ内のファイルがリストされます。他の種類のファイル(通常のファイル、シンボリックリンクなど)を渡すと、そのファイルのみがリストされます。 (これは各引数に個別に適用されます。)オプション-dは、lsにディレクトリに降りないように指示します。

lsには、ディレクトリを再帰的にリストするように指示するオプション-Rがあります。ただし、適用範囲が限られているため、出力をあまりフィルタリングできません。

パターンマッチングを実行する最初のツールはシェル自体です。他のコマンドは必要ありません。ワイルドカードを入力するだけで設定は完了です。これは globbing として知られています。

echo *filename*

従来、ワイルドカードは現在のディレクトリ(または指定されたディレクトリ:echo /some/where/*filename*)に制限されていました。 *は任意のファイル名またはファイル名の一部と一致しますが、*.txtfoo/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'は、名前がそのパターンに一致するファイルのみをリスト(または操作)することを示しています。過去24時間に変更されたファイルに一致する-mtime -1など、他の多くのフィルターがあります。 -name '*filename*'の引用符を省略できる場合もありますが、ワイルドカードが現在のディレクトリ内のどのファイルとも一致しない場合のみです(上記を参照)。全体として、短い形式は

find -name '*filename*'

ファイルの名前(の一部)がわかっている場合のもう1つの便利なツールは、locateです。このツールは、ファイル名のデータベースを照会します。通常のシステムでは、毎晩更新されます。 find /に対するlocateの利点は、はるかに高速であることです。欠点は、その情報が古くなる可能性があることです。マルチユーザーシステムでの動作が異なるlocateの実装はいくつかあります。基本的なlocateプログラムは、一般に読み取り可能なファイルのみにインデックスを付けます(アカウント内のすべてのファイルにインデックスを付ける2番目のデータベースを作成するには、updatedbを実行する必要があります)。 ;他のバージョン(mlocate、slocate)には、すべてのファイルのインデックスを作成し、locateプログラムでデータベースをフィルターして、表示できるファイルのみを返すものがあります。

locate filename

ディストリビューション内のパッケージによってファイルが提供されていると思い、パッケージの名前ではなくファイルの名前(の一部)を知っていて、パッケージをインストールしたい場合があります。多くのディストリビューションがそのためのツールを提供しています。 Ubuntuではapt-file search filenameです。他のシステムでの同等のコマンドについては、 Pacman Rosetta を確認してください。

dOSの例と同等のものは次のようになります。

cd /
find . -name \*filename\* -print

ただし、Linuxでは通常、-print引数は不要です。他のオペレーティングシステムで作業している場合は、知っておくと便利です。

6
Tim Kennedy

"fast"が必要だが、ミッションクリティカルな状況ではなく、それが存在するかどうかと、それがどこにあるかだけを知りたい場合は、locateを使用できます。情報を収集するように指示したディレクトリにすべてのファイルのデータベースを保持します。

デフォルトのインストール(Ubuntuの場合)では、locateはファイルシステムをスキャンしてデータベースを更新するcronジョブを毎日セットアップします...

次のcron更新の前にデータベースを最新の状態にする必要があると思われる場合は、通常、_Sudo updatedbを実行してからfindを実行する方がlsまたはlocateよりも高速です。より多くの検索を行う必要がある場合は、間違いなく高速です...その名前が示すように、updatedbは、locateが使用するデータベースを更新します...

locateには正規表現が組み込まれているため、非常に便利です...スクリプトではfindを使用しますが、コマンドラインでfindを使用することはほとんどありません。 (個人的な)スクリプトでlocateを使用しています...例。 locate -bir "oo.*datt.*mp4$"

locateは、一致したファイルの完全修飾パスを返します。

5
Peter.O
find [path] -name [filename]

たとえば、/ homeディレクトリでfooを含むファイル名を検索するには、次のコマンドを使用します。

find /home -name *foo*

findコマンドと引数の詳細については、コマンドman findを使用してください。

2
josh-cain