web-dev-qa-db-ja.com

WindowsでUnixタイプの「検索」?

Windows CLI(cmd)を使用して、名前の一部を知っているファイルをどのように見つけますか?たとえば、すべてのWindowsワークステーションはjavacを別の場所にインストールしますが、Windows CLI(cmd)からそれをどのように見つけますか?

グーグルWindowsエクスプローラー(ファイルマネージャー)のGUIの使用、またはいくつかのフリーウェアアプリケーションのダウンロードについてのみ言及しています。 Windowsには、実際にはLocateコマンドが組み込まれていませんか?サーバーエディションにはありますか?私はしますnot cygwinやその他をインストールしたいのですが、これらは通常私のマシンではありません。

17
dotancohen

dirを使用して、必要なことを実行できます。

dir [filename] /s

[filename]を探しているファイル名に置き換えます。ワイルドカードを使用できるはずです。/sはサブディレクトリを検索するので、必要に応じてC:のルートから開始し、ドライブ全体をチェックすることができます。

21
Windos

「どこで」コマンドについて誰も話しませんか?現在の環境のPATHで実行可能ファイルを検索します。

where <executable>

c:\ where
The syntax of this command is:

WHERE [/R dir] [/Q] [/F] [/T] pattern...

Description:
    Displays the location of files that match the search pattern.
    By default, the search is done along the current directory and
    in the paths specified by the PATH environment variable.

ウィンドスが最も簡単な答えを持っています。ただし、コマンドラインが好きな場合は、powershellも確認することをお勧めします。使用するのと同じタイプの検索を実行するには

get-childitem [starting path eg c:\users\] -filter [wildcarded search or filename] -recurse

これは、便利なforeachステートメントにポンプされ、検索結果に対してプロセスを実行できるという素晴らしい副次的な利点があります。

get-childitem [starting path eg c:\users\] -filter [wildcarded search or filename] -recurse |
    foreach ($_){
          [do something to $_.fullname , like maybe display my image file or relocate it etc..]
    }
4
OldWolf

私は単に Windows用のプログラムを見つける を取得しました。 Read Meの指示に従って、.dllファイルと.exeをsystem32にコピーするだけです。

代替方法には、環境変数PATHにプログラムパスを追加することが含まれます。

「いいね」のようなロケートを探している場合は、Windowsでロケートするという考え方です。 :)

3
Cheeku

手でインストールする必要はありません。 http://chocolatey.org を参照してください

choco install winlocate

シェル環境を再起動します

Updatedb.bat -a
Locate.bat somefile
2
Jonathan

質問はややあいまいです。

ファイル(OPの本文に記載)を見つけたいが、「locate-type」コマンド/アプリ(タイトルに記載)も必要な場合。大きな意味を持つ1つの微妙な考慮事項があります。次の2つの方法で検索できます。

  1. 各検索でターゲットツリー構造を直接検索する(低速)。

  2. 最初にターゲットツリー構造のデータベースを作成し(時間がかかる場合があります)、次にデータベースを検索して検索します(非常に高速)。検索で良好な結果を得るには、データベースを定期的に更新する必要があります。 http://en.wikipedia.org/wiki/Locate_%28Unix%29 を参照してください。

Unix locateは「タイプ2」ですが、OPの本体に従って、2つの方法のいずれでも問題ありません。さらに、CLIオプションについて具体的に尋ねます。

以下にいくつかのオプションをリストし、それらがCLI/GUIかどうかを指定し、タイプ1/2とコメントを追加します。

  1. http://locate32.cogit.net/ (すでに John T によってポイントされ、次に Cheek によってポイントされます)。 GUI、タイプ2。ポータブルバージョンがあります。卓越した使いやすさと設定可能性。 Unix locateに非常に似ています(私が使用していてとても気に入りました)。
    :UnixのUpdatedbに慣れていると、データベースの更新にかなり時間がかかります(もちろん、スキャンされたツリーのサイズ)、locate32非常に速い。どうすれば改善できるのかわかりません。

  2. http://sourceforge.net/projects/winlocate/ CLI、タイプ2。

  3. dir [ファイル名]/sWindosによるソリューション 。 CLI、1と入力します。

  4. gci ...OldWolfによるソリューション 。 CLI、1と入力します。

  5. http://gnuwin32.sourceforge.net/packages/findutils.htm CLI、2と入力します。

  6. すべて GUI、タイプ?.

私はこれがずっと前に答え​​られたことを知っています、しかしこれはunix/linuxで使用されているlocate関数をシミュレートする私のスクリプトです

これをLocate.batとして保存し、System32に配置しますORそれが格納されているディレクトリから実行します。この「cmd> Locate javac.exe」のような1つのパラメータを取ります

検索/ cスイッチ(2番目のパラメーターはインスタンスの数をカウントするため)および検索/?ヘルプテキストを表示します

@echo off 
if [%1]==[] goto :usage
if [%1] == [/?] (
:usage
echo Usage: 
echo locate "filename" { optional } /c { shows counter }
echo note:  results are exported to C:\temp\result.txt
goto :EOF
) else (
     setlocal EnableDelayedExpansion
     dir /a /b /s C:\ | findstr /I "%1" > C:\temp\result.txt 
     type C:\temp\result.txt | more /S
     set counter=0
     if [%2] == [/c] (
         for /F %%i in ('type C:\temp\result.txt') do (
             set /a counter=!counter!+1
         )
         echo Total Matches: !counter!
      ) 
)
endlocal > nul  
goto :EOF

編集:(ファイル名だけでなく、任意の検索語句を許可するなど、より整理された、より幅広い状況に対応できる更新されたスクリプト)

@echo off
::initialize local varaibles to default values
setlocal

set file=
set directory=
set toppath=top

::some switch validation ( from command line )
if [%1]==[] goto :Usage
if [%1]==[/?] goto :Usage
if [%1]==[/help] goto :Usage

::handle switches with if structures
if [%2]==[/c] (
     set count=yes
) ELSE (
     if [%2]==[/t] ( if [%3]==[] (goto :Usage) else (set toppath=%3))   
     if [%4]==[/c] (
          set count=yes
     ) ELSE (
          set count=
     )
)
set file=%1

::Directory Validation ( Goto jumps possible, along with raptors ) 
if [%toppath%] == [] ( 
    IF NOT EXIST %toppath% goto :FolderInvalid 
) else (
    if [%toppath%] neq [top] set directory=%toppath%
)
set toppath=
setlocal EnableDelayedExpansion

::Run Bulk of the Script
dir /a /b /s %directory% | findstr /I "%file%" > C:\temp\result.txt 
type C:\temp\result.txt | more /S
     set counter=0
     if [%count%]==[yes] (
         for /F %%i in ('type C:\temp\result.txt') do (
             set /a counter=!counter!+1
     )
     echo Total Matches: !counter!
) 

goto :End

:Usage
echo locate ^[file^] {term^/file to look for} ^| ^[^/t^] {dir^/subdirs to search} ^| ^[^/c^] {show counter}
echo.
echo notes to user:  1. Results are exported to C:\temp\result.txt
echo                 2. Default search dir is the current unless specified by ^/t switch
echo                 3. For best results write switches in order given ! ( or beware of raptors )
goto :End

:FolderInvalid
echo Folder Invalid

:End
endlocal > nul
2
user422773

見つけて更新するためのPowerShellポートを作成しました。 SQLiteをバックエンドとして使用し、自動インストーラーを備えています。ただ

.\Invoke-Locate.ps1 -install. 

検索には約300ms /クエリかかります。

その後

locate whatever

そしてあなたは設定されています。

enter image description here

https://gallery.technet.Microsoft.com/scriptcenter/Invoke-Locate-PowerShell-0aa2673a

2
Chrissy LeMaire

将来の宇宙のWindows歴史家のために、私たちは Everything Search に恵まれています。画像dmenu + find + mlocateは、cliオプション付きのタイトでかわいいWindowsサービスにまとめられています。このことを除いて、リアルタイムでインデックスを更新します。 Linuxでは何も近づきません。これは、「このくそったカーネルがもう少しMicrosoftyだったらいいのに」とあなたが言う数回のうちの1つになるでしょう。

1
Steve Goranson

簡単に言えば、Windowsには完全に同等なものはないということです。回避策は、dirコマンドを使用することです。これは、特殊文字をサポートするディレクトリリストコマンドであり、承認された回答で指摘されているとおりに使用できます。

多くのUnixライクなシステムでのLocateコマンドは、インデックスベースの検索です。ファイルシステムにインデックスを付けるUpdatedbコマンドと連携して機能します。インデックスベースの検索であるため、通常、dirfindなどのテキストベースの検索コマンドよりもはるかに高速です。 Unixでは、特に深いディレクトリ階層を検索する場合。

1
dww