web-dev-qa-db-ja.com

コマンドラインからディレクトリ内のファイルを検索

Eclipseやtextmateなどのエディター/ IDEには、プロジェクトディレクトリで特定のファイルをすばやく見つけるためのショートカットがあります。

ディレクトリ内のファイル名(再帰的に)、bashまたは他のシェルでフルパス補完を行う同様のツールはありますか?

たくさんのディレクトリを持つプロジェクトがあり、そこには深いものがあります(ため息、Java)。シェルのタブを押すと、直接のディレクトリ内のファイルのみが循環します。これは十分ではありません= /

44
whoisbenli
find /root/directory/to/search -name 'filename.*'
# Directory is optional (defaults to cwd)

標準のUNIXグロビングがサポートされています。見る - man find 詳細については。

Vimを使用している場合は、次を使用できます。

:e **/filename.cpp

または:tabnまたはファイル名を受け入れるVimコマンド。

63
strager

ファイルのリストを使用して何かを実行したい場合は、findをbash $()コンストラクトと組み合わせて使用​​できます(ネストが許可されているため、バックティックよりも優れています)。

たとえば、プロジェクトディレクトリの最上位にいて、「btree」で始まるすべてのCファイルのリストが必要だとします。コマンド:

find . -type f -name 'btree*.c'

それらのリストを返します。しかし、これは彼らと一緒に何かをするのに本当に役立ちません。

そのため、これらのすべてのファイルで文字列「ERROR」を検索するか、すべて編集することを想定します。次のいずれかを実行できます。

grep ERROR $(find . -type f -name 'btree*.c')
vi $(find . -type f -name 'btree*.c')

これをする。

8
paxdiablo

UNIXの世界(tcsh(ため息)を使用)で、ファイルを検索するためのあらゆる種類の「検索」エイリアス/スクリプトのセットアップを使用していました。デフォルトの「find」構文は少し不格好だと思うので、「find。-print」をgrepにパイプするエイリアス/スクリプトを使用して、検索に正規表現を使用できるようにしました。

# finds all .Java files starting in current directory
find . -print | grep '\.Java'

#finds all .Java files whose name contains "Message"
find . -print | grep '.*Message.*\.Java'

もちろん、上記の例は昔ながらの検索で実行できますが、より具体的な検索があれば、grepはかなり役立ちます。 「find。-print」に含まれるディレクトリが多すぎて再帰できない場合を除き、これは非常にうまく機能します。 (たとえば、ルート "/"でこれを実行したくない場合)

3
Andy White

これを使用して script プロジェクト内のディレクトリ間でファイルをすばやく検索します。検索用の新しいバッファを開いたり閉じたりすることで、Vimのオートコンプリートをうまく利用できることがわかりました。また、可能な限りスマートに完成するため、通常は1〜2文字を入力するだけで、プロジェクト内の任意のディレクトリでファイルを開くことができます。 Javaプロジェクトであるため、これを使用し始め、多くの時間を節約できました。編集セッションを開始するときに:FC(ディレクトリ名)と入力してキャッシュを1回作成するだけです。また、単に。を使用して現在のディレクトリとすべてのサブディレクトリを取得することもできます。その後、単に:FF(またはFSで新しいスプリットを開く)と入力すると、新しいバッファが開きます。必要なファイルを選択します。ファイルを選択すると、一時バッファーが閉じられ、要求されたファイル内に移動して編集を開始できます。さらに、 here はStack Overflowの別のリンクです。

1
SnapShot

http://content.hccfl.edu/pollock/Unix/FindCmd.htm

Linux/unixの「find」コマンド。

0
Stefan Kendall

はい、bashにはファイル名補完メカニズムがあります。私はそれらを自分では使いません(学ぶのが面倒で、緊急にするのに十分な頻度で必要だとは思いません)が、基本的なメカニズムは最初の数文字を入力してからタブを入力することです。これにより、名前が明確である限り、名前が可能な限り拡張されます(おそらくまったく拡張されません)。 good olのmanページには、完了に関連するEmacsスタイルのコマンドが多数あります。

0

locate <file_pattern>

*** findは確かに機能し、特定のディレクトリをターゲットにできます。ただし、このコマンドはlocateコマンドよりも低速です。 Linux OSでは、毎朝、すべてのディレクトリとファイルのリストを含むデータベースが構築され、locateコマンドがこのデータベースを効率的に検索するため、作成されていないファイルを検索する場合今日、これはそのようなタスクを達成する最速の方法です。

0
Marquistador