Unix-Typ "locate" unter Windows?


17

Wie findet man unter Verwendung der Windows CLI (cmd) eine Datei, von der er einen Teil des Namens kennt? Zum Beispiel installiert jede einzelne Windows-Workstation javac an einem anderen Ort. Wie würde man es über die Windows-CLI (cmd) finden?

Googeln Ich sehe Erwähnung nur der Verwendung des Windows Explorer (Dateimanager) GUI oder das Herunterladen einer Freeware-Anwendung. Verfügt Windows nicht über einen integrierten Befehl zum Suchen? Haben die Server-Editionen es? Ich möchte Cygwin oder etwas anderes nicht installieren, dies sind normalerweise nicht meine Maschinen.


3
Nichts, was in die Windows-Befehlszeile integriert ist, ist wirklich so gut zu lokalisieren. Ich würde empfehlen locate32 ( locate32.net )
John T

javacsollte normalerweise am selben Ort sein ...
Tamara Wijsman

1
@ JohnT dieser Ort funktioniert nicht mehr - die aktualisierte locate32- Startseite
TrojanName

1
Probieren Sie die Git-Bash.exe alias MINGW aus, die locateund updatedb--per stackoverflow.com/questions/36841241/…
MarkHu am

Antworten:


23

Sie sollten in der Lage sein, das zu tun, womit Sie tun müssen dir:

dir [filename] /s

Ersetzen Sie [Dateiname] durch den gesuchten Dateinamen. Sie sollten in der Lage sein, Platzhalter zu verwenden. Mit / s werden Unterverzeichnisse durchsucht, sodass Sie bei Bedarf im Stammverzeichnis von C: beginnen und das gesamte Laufwerk überprüfen können.


Wenn Sie das gesamte Laufwerk nach einem gemeinsamen Dateinamen durchsuchen, lohnt es sich möglicherweise auch, / p einzuschließen, damit nur jeweils eine Seite mit Ergebnissen angezeigt wird.
Windos

Danke, das sieht perfekt aus. Ich weiß zumindest oft, dass ich in C: \ WINDOWS suchen muss, damit dies die Zeit einschränken kann, die die Suche in Anspruch nimmt.
Dotancohen

1
Ich glaube nicht, dass javacdas installiert ist C:\WINDOWS...
Tamara Wijsman

Funktioniert nicht mit mehreren Laufwerken / Partitionen. Und schon 2011 hatte ich mehr als nur C: Linux. Dateisysteme interessieren mich nicht.
Jürgen A. Erhard

1
@ JürgenA.Erhard um fair zu sein ... Linux selbst kümmert sich nicht wirklich um 'Dateisysteme', wie sie von Windows dargestellt werden (nach meinem begrenzten Verständnis). Wenn Sie heutzutage mehr als ein Laufwerk durchsuchen möchten, ist PowerShell meine Wahl Allerdings, da Sie in der Lage wären, alle Ihre Volumes zu gruppieren und Get-ChildItem auf alle zu richten.
Windos

11

Niemand spricht vom "Wo" -Befehl? Durchsucht die ausführbare Datei im Pfad der aktuellen Umgebung.

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.

4

Windos hat die einfachste Antwort. Wenn Sie jedoch die Befehlszeile mögen, sollten Sie sich auch Powershell ansehen. Um dieselbe Art von Suche durchzuführen, die Sie verwenden würden

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

Was den netten Nebeneffekt hat, in eine handliche foreach-Anweisung gepumpt zu werden und einen Prozess gegen die Suchergebnisse auszuführen.

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..]
    }

3
Das fühlt sich zu lang an, um es abzutippen.
Tamara Wijsman

2
Get-ChildItem kann als gcioder abgekürzt werden ls.
digitxp

Zum Glück, im Gegensatz zu cmd, in PowerShellkönnen Sie mit „Tab“ Vorschläge , um zu sehen, wie in Linux. Es gibt also nicht so viele, die man tippen kann. Und in meinem Fall lsfunktioniert PowerShell nicht.
WesternGun

3

Ich habe einfach ein Lokalisierungsprogramm für Windows bekommen . Folgen Sie einfach den Anweisungen zum Lesen und kopieren Sie die DLL-Dateien und die EXE-Datei nach system32.

Die Alternative besteht darin, den Programmpfad der Umgebungsvariablen PATH hinzuzufügen.

Die Idee ist, auf Windows zu lokalisieren, wenn Sie nach etwas "Ähnlichem" suchen. :)


Vielen Dank, Cheeku, das sieht nach einer praktischen Anwendung aus. Ich habe jedoch erwähnt, dass ich keine Anwendungen auf dem System installieren kann, da dies normalerweise nicht meine Systeme sind.
Dotancohen

2
Ja, aber ich habe trotzdem geantwortet, da andere Leute wie ich es nützlich finden und andere nicht verwirrt sein können, da dieser Beitrag bereits eine akzeptierte Antwort hat!
Cheeku

1
locateist auf meinem Win7-Computer. Es wird beanstandet, dass die Datenbank 435 Tage alt ist, wenn die Installation nicht älter als 3 Monate ist. Und updatedbist nicht enthalten.
Winnief

@vinnief Das ist vermutlich ein besonderes Problem bei deiner Installation.
Cheeku

1
@ Cheeku - Dies ist die gleiche App, auf die John T hingewiesen hat . Es ist nicht CLI, wie der OP gefragt hat, aber es ist fantastisch.
sancho.s Reinstate Monica

2

Die Frage ist etwas mehrdeutig.

Sie möchten eine Datei suchen (im Hauptteil des OP angegeben), möchten aber auch einen Befehl / eine App vom Typ "locate" (im Titel angegeben). Es gibt eine subtile Überlegung mit enormen Auswirkungen. Sie können mit zwei verschiedenen Methoden suchen:

  1. Suche in der Zielbaumstruktur direkt bei jeder Suche (langsam).

  2. Erstellen Sie zuerst eine Datenbank mit der Zielbaumstruktur (möglicherweise zeitaufwändig) und suchen Sie dann die Datenbank (sehr schnell). Die Datenbank muss regelmäßig aktualisiert werden, um bei Suchvorgängen gute Ergebnisse zu erzielen. Siehe http://en.wikipedia.org/wiki/Locate_%28Unix%29 .

Unix locateist vom "Typ 2", aber gemäß dem Aufbau Ihres OPs sind Sie mit jeder der beiden Methoden einverstanden. Darüber hinaus fragen Sie gezielt nach CLI-Optionen.

Ich liste unten einige Optionen auf und gebe an, ob es sich um CLI / GUI handelt, gebe 1/2 ein und füge einige Kommentare hinzu.

  1. http://locate32.cogit.net/ (bereits von John T und dann von Cheeku erwähnt ). GUI, Typ 2. Es gibt eine portable Version. Hervorragende Benutzerfreundlichkeit und Konfigurierbarkeit. Sehr ähnlich zu Unix locate(was mir sehr gut gefallen hat).
    Hinweis : Da die UpdatedbAktualisierung einer Datenbank unter Unix sehr lange dauert (das hängt natürlich von der Größe des gescannten Baums ab), finde ich das locate32 sehr schnell. Ich weiß nicht, wie es so viel verbessert werden kann.

  2. http://sourceforge.net/projects/winlocate/ CLI, Typ 2.

  3. dir [filename] / s , die Lösung von Windos . CLI, geben Sie 1 ein.

  4. gci ... , die Lösung von OldWolf . CLI, geben Sie 1 ein.

  5. http://gnuwin32.sourceforge.net/packages/findutils.htm CLI, Typ 2.

  6. Alles GUI, Typ?


1
Vielen Dank, dies ist eine gute Erklärung und eine schöne Zusammenfassung der Optionen.
Dotancohen


2

Keine manuelle Installation erforderlich. Siehe http://chocolatey.org

choco install winlocate

Starten Sie die Shell-Umgebung neu

Updatedb.bat -a
Locate.bat somefile

1
winlocate ist nicht mehr auf Chocolatey.
Lennart

2

Ich weiß, dass dies vor langer Zeit beantwortet wurde, aber dies ist mein Skript zur Simulation der unter Unix / Linux verwendeten Locate-Funktion

Speichern Sie dies als locate.bat und platzieren Sie es in System32 ODER führen Sie es in dem Verzeichnis aus, in dem es gespeichert ist. Nimmt einen Parameter wie diesen "cmd> locate javac.exe"

Der Schalter locate / c (als zweiter Parameter wird die Anzahl der Instanzen gezählt) und locate /? zeigt den Hilfetext an

@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

BEARBEITEN: (Aktualisiertes Skript, übersichtlicher und für eine Vielzahl von Situationen geeignet, z. B. für jeden Suchbegriff, nicht nur für einen Dateinamen)

@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

1

Für zukünftige Weltraum-Windows-Historiker: Wir wurden mit Everything Search gesegnet . Picture dmenu + find + mlocate wurde zu einem engen, hübschen kleinen Windows-Dienst mit Cli-Optionen zusammengefasst. Nur dass dieses Ding seinen Index in Echtzeit aktualisiert . Nichts unter Linux kommt dem nahe. Es wird eines der wenigen Male sein, dass Sie sagen: "Ich wünschte, dieser verdammte Kernel wäre etwas Microsofty".


Nettes Dienstprogramm. Danke fürs Schreiben.
Rüdiger Wolf

1

Die kurze Antwort ist, dass es unter Windows kein genaues Äquivalent gibt . Die Problemumgehung besteht darin, den Befehl dir zu verwenden . Dies ist ein Verzeichnislistenbefehl, der Sonderzeichen unterstützt und wie in der akzeptierten Antwort angegeben verwendet werden kann.

Der Befehl Locate ist auf vielen Unix-ähnlichen Systemen eine indexbasierte Suche. Es funktioniert zusammen mit dem Befehl Updatedb , mit dem Dateisysteme indiziert werden. Da es sich um eine indexbasierte Suche handelt, ist sie in der Regel viel schneller als textbasierte Suchbefehle wie dir und find unter Unix, insbesondere beim Durchsuchen tiefer Verzeichnishierarchien.


whereist genau gleichwertig.
Alex78191

-3

Mir ist keine CLI-Methode bekannt, die dies unter Windows ermöglicht. Bedenken Sie, dass die Windows-CLI von normalen Benutzern verlassen wurde, sodass sie im Allgemeinen weniger ausgereifte Tools bietet. Ihre beste Wette ist möglicherweise die Verwendung von Gnu findin Windows, das Sie von GnuWin32 erhalten können . Wenn Sie ein Skript entwickeln, müssen Sie nur die find.exeAbhängigkeiten des Skripts mit einbeziehen (keine Sorge, es ist nicht sehr groß).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.