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


10

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

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

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

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


ええと、この猫の皮をむく方法は明らかに複数あります。それを行う方法があるかどうか私はまだ知りたいlsです?
Iszi

回答:


13
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

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

ディレクトリの内容を一覧表示することは、の2番目の機能の一種ですls。の主な仕事はls、その複雑さの大部分を占めており、その表示を微調整することです。(コントロールこれは、両方の真である各ファイルに関する表示する情報とどのように表示がフォーマットされています。というオプションの数対表示するファイルを選択することに関連したオプションの数マニュアルを見て、比較GNUのlsのあなた」をLinux、および初期の頃からオプションの少ない他のシステムで見つかります。)

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

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を確認してください。


これをもう一度賛成票に入れたいと思います。今夜、別のプロジェクトのためにこれを調べなければなりませんでした。ありがとう、@ Gilles!
Iszi

6

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

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

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


5

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

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

あなたは、次のcron更新前の日付にデータベースを起動する必要があると感じた場合は、通常よりも高速であるfindか、ls単に実行するようにsudo updatedbしてからlocate。より多くの検索を行う必要がある場合は、間違いなく高速です...その名前が示すように、使用updatedbするデータベースを更新しますlocate...

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

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


2
find [path] -name [filename]

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

find /home -name *foo*

コマンドman findを使用して、findコマンドと引数の詳細を確認します。


3
*シェルがそれらを解釈しないようにするには、s を引用またはエスケープする必要があります。
ショーンJ.ゴフ

それはディストリビューション/シェル固有ですか?Fedora 16でエスケープせずに実行したところ、問題なく動作しました。
josh-cain

1
一部のシェルには、偶然一致しない場合に星をプログラムに渡すオプションがあります。そのパターンに一致するファイルを現在のディレクトリに作成して、コマンドを再試行してください。
ショーンJ.ゴフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.