(部分的に既知のファイル名を持つ)ファイルがファイルシステムのどこにあるのかを知りたいのですが。 GUIユーティリティを使用するのではなく、コマンドラインからこれを行う方法を知りたいです。
Windowsでは、次のコマンドを実行します。
cd /d C:\
dir *filename* /s
Linuxの同等機能は何ですか?
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*
)に制限されていました。 *
は任意のファイル名またはファイル名の一部と一致しますが、*.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'
は、名前がそのパターンに一致するファイルのみをリスト(または操作)することを示しています。過去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
引数は不要です。他のオペレーティングシステムで作業している場合は、知っておくと便利です。
"fast"が必要だが、ミッションクリティカルな状況ではなく、それが存在するかどうかと、それがどこにあるかだけを知りたい場合は、locate
を使用できます。情報を収集するように指示したディレクトリにすべてのファイルのデータベースを保持します。
デフォルトのインストール(Ubuntuの場合)では、locate
はファイルシステムをスキャンしてデータベースを更新するcron
ジョブを毎日セットアップします...
次のcron更新の前にデータベースを最新の状態にする必要があると思われる場合は、通常、_Sudo updatedb
を実行してからfind
を実行する方がls
またはlocate
よりも高速です。より多くの検索を行う必要がある場合は、間違いなく高速です...その名前が示すように、updatedb
は、locate
が使用するデータベースを更新します...
locate
には正規表現が組み込まれているため、非常に便利です...スクリプトではfind
を使用しますが、コマンドラインでfind
を使用することはほとんどありません。 (個人的な)スクリプトでlocate
を使用しています...例。 locate -bir "oo.*datt.*mp4$"
locate
は、一致したファイルの完全修飾パスを返します。
find [path] -name [filename]
たとえば、/ homeディレクトリでfooを含むファイル名を検索するには、次のコマンドを使用します。
find /home -name *foo*
findコマンドと引数の詳細については、コマンドman find
を使用してください。