«Localiser» de type Unix sous Windows?


17

À l'aide de la CLI Windows (cmd), comment localiser un fichier dont il connaît une partie du nom? Par exemple, chaque poste de travail Windows unique installe javac dans un emplacement différent, comment le trouver dans la CLI Windows (cmd)?

Sur Google, je ne vois que l'utilisation de l'interface graphique de Windows Explorer (gestionnaire de fichiers) ou le téléchargement d'une application gratuite. Windows n'a-t-il vraiment pas de commande de localisation intégrée? Les éditions serveur l'ont-elles? Je ne pas veux installer Cygwin ou quoi que ce soit d' autre, ceux - ci ne sont généralement pas mes machines.


3
Rien de intégré à la ligne de commande Windows n'est vraiment similaire à localiser. Je recommanderais Locate32 ( Locate32.net )
John T

javacdevrait généralement être au même endroit ...
Tamara Wijsman

1
@JohnT cet emplacement ne fonctionne plus - la maison de Locate32 mise à jour est Locate32.cogit.net
TrojanName

1
Essayez le Git-Bash.exe alias MINGW qui comprend locateet updatedb--per stackoverflow.com/questions/36841241/…
MarkHu

Réponses:


22

Vous devriez pouvoir faire ce que vous devez faire avec dir:

dir [filename] /s

Remplacez [nom de fichier] par le nom de fichier que vous recherchez, vous devriez pouvoir utiliser des caractères génériques. / s le fait rechercher dans les sous-répertoires, donc si vous en avez besoin, vous pouvez démarrer à la racine de C: et le faire vérifier tout le lecteur.


Si vous recherchez un nom de fichier commun sur l'ensemble du lecteur, il peut également être utile d'inclure / p pour qu'il ne vous présente qu'une page de résultats à la fois.
Windos

Merci, cela a l'air parfait. Je sais souvent au moins que je dois rechercher dans C: \ WINDOWS afin que cela puisse réduire le temps que prend la recherche.
dotancohen

1
Je ne pense pas que cela javacsoit installé pour C:\WINDOWS...
Tamara Wijsman

Ne fonctionne pas avec plusieurs lecteurs / partitions. Et même en 2011, j'avais plus que la localisation de C: Linux ne se souciait pas des systèmes de fichiers.
Jürgen A. Erhard

1
@ JürgenA.Erhard pour être juste ... Linux lui-même ne se soucie pas vraiment des "systèmes de fichiers" tels que Windows les présente (à ma connaissance limitée). De nos jours, si vous vouliez rechercher sur plus d'un lecteur, PowerShell serait mon choix cependant, car vous seriez en mesure de regrouper tous vos volumes et de lancer Get-ChildItem sur chacun d'eux.
Windos

12

Personne ne parle de commande "où"? il recherche le fichier exécutable dans le CHEMIN de l'environnement actuel.

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 a la réponse la plus simple. Mais si vous aimez la ligne de commande, vous voudrez peut-être aussi regarder PowerShell. Pour effectuer le même type de recherche que vous utiliseriez

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

Ce qui a l'avantage de pouvoir être pompé dans une déclaration foreach pratique et d'exécuter un processus par rapport aux résultats de recherche.

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
Cela semble trop long pour taper.
Tamara Wijsman

2
Get-ChildItem peut être abrégé en gciou ls.
digitxp

Heureusement, contrairement à cmd, PowerShellvous pouvez utiliser "Tab" pour voir des suggestions, comme sous Linux. Donc, ce n'est pas tellement de taper en fait. Et, dans mon cas, lsdans PowerShell ne fonctionne pas.
WesternGun

3

J'ai simplement obtenu un programme de localisation pour Windows . Il vous suffit de suivre les instructions de lecture et de copier les fichiers .dll et .exe sur system32.

L'alternative comprend l'ajout du chemin du programme à la variable d'environnement PATH.

L'idée est de se localiser sur Windows si vous cherchez quelque chose de "similaire" à localiser. :)


Merci Cheeku, cela ressemble à une application pratique. Cependant , je l'ai fait mention que je ne peux pas installer des applications sur le système car ils sont généralement pas mes systèmes.
dotancohen

2
Oui, mais j'ai quand même répondu car d'autres personnes comme moi peuvent le trouver utile et les autres ne seront pas confus car ce post a déjà une réponse acceptée!
Cheeku

1
locateest sur mon ordinateur Win7. Il se plaint que la base de données a 435 jours, alors que l'installation n'a pas plus de 3 mois. Et updatedbn'est pas inclus.
vinnief

@vinnief C'est un problème particulier avec votre installation, je présume.
Cheeku

1
@Cheeku - Ceci est la même application pointée par John T . Ce n'est pas CLI comme l'OP l'a demandé, mais c'est génial.
sancho.s Réintègre Monica

2

La question est quelque peu ambiguë.

Vous souhaitez localiser un fichier (indiqué dans le corps de l'OP), mais vous souhaitez également une commande / application "type de localisation" (indiquée dans le titre). Il y a une considération subtile aux implications énormes. Vous pouvez localiser avec deux méthodes différentes:

  1. Recherche de l'arborescence cible directement dans chaque recherche (lent).

  2. Créer d'abord une base de données de l'arborescence cible (peut prendre beaucoup de temps), puis localiser en recherchant la base de données (très rapide). La base de données doit être mise à jour périodiquement pour obtenir de bons résultats dans les recherches. Voir http://en.wikipedia.org/wiki/Locate_%28Unix%29 .

Unix locateest de "type 2", mais selon le corps de votre OP, vous seriez d'accord avec l'une des deux méthodes. De plus, vous posez des questions spécifiques sur les options CLI.

Je liste ci-dessous quelques options, et je précise si elles sont CLI / GUI, tapez 1/2, et j'ajoute quelques commentaires.

  1. http://locate32.cogit.net/ (déjà signalé par John T puis par Cheeku ). GUI, type 2. Il existe une version portable. Facilité d'utilisation et configurabilité exceptionnelles. Très similaire à Unix locate(que j'ai utilisé et aimé beaucoup).
    Remarque : étant habitué au temps qu'Unix met Updatedbà jour une base de données (bien sûr, cela dépend de la taille de l'arborescence analysée), je trouve locate32 extrêmement rapide. Je ne sais pas comment cela peut être tellement amélioré.

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

  3. dir [filename] / s , la solution de Windos . CLI, tapez 1.

  4. gci ... , la solution d'OldWolf . CLI, tapez 1.

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

  6. Tout GUI, tapez?.


1
Merci, c'est une bonne explication et un joli résumé des options.
dotancohen


2

Pas besoin d'installer à la main. Voir http://chocolatey.org

choco install winlocate

Redémarrez l'environnement du shell

Updatedb.bat -a
Locate.bat somefile

1
winlocate n'est pas (plus) sur Chocolatey.
Lennart

2

Je sais que celui-ci a reçu une réponse il y a longtemps, mais ceci est mon script pour simuler la fonction de localisation utilisée dans unix / linux

Enregistrez-le sous le nom de Locate.bat et placez-le dans System32 OU exécutez-le à partir du répertoire dans lequel il est stocké. Prend un paramètre comme celui-ci "cmd> Locate javac.exe"

Le commutateur Locate / C (comme un deuxième paramètre comptera le nombre d'instances) et Locate /? affichera le texte d'aide

@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

EDIT: (Script mis à jour, plus organisé et peut gérer une plus grande variété de situations, comme autoriser n'importe quel terme de recherche et pas seulement un nom de fichier)

@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

Pour les futurs historiens de Windows dans l'espace: nous avons eu la chance de tout chercher . Picture dmenu + find + mlocate enroulé en un joli petit service Windows avec options cli. Sauf que cette chose met à jour son index en temps réel . Rien sur Linux ne se rapproche. Ce sera l'une des rares fois où vous direz "bon, j'aimerais que ce sacré noyau soit un peu plus Microsofty"


Belle utilité. Merci d'avoir posté.
Rudiger Wolf

1

La réponse courte est qu'il n'y a pas d'équivalent exact sous Windows . La solution consiste à utiliser la commande dir . Il s'agit d'une commande de liste de répertoires qui prend en charge les caractères spéciaux et peut être utilisée comme indiqué dans la réponse acceptée.

La commande Locate sur de nombreux systèmes de type Unix est une recherche basée sur un index. Il fonctionne en tandem avec la commande Updatedb qui indexe les systèmes de fichiers. Comme il s'agit d'une recherche basée sur un index, elle est généralement beaucoup plus rapide que les commandes de recherche textuelle telles que dir et find sur Unix, en particulier lors de la recherche de hiérarchies de répertoires approfondies.


whereest l'équivalent exact.
Alex78191

-3

Je ne connais aucune méthode CLI pour le faire dans Windows. Gardez à l'esprit que la CLI Windows a été abandonnée par les utilisateurs ordinaires, elle offre donc un ensemble d'outils généralement moins mature. Votre meilleur pari pourrait être d'utiliser le gnu finddans Windows, que vous pouvez obtenir de GnuWin32 . Si vous développez un script, il vous suffira d'inclure find.exeet ses dépendances avec le script (ne vous inquiétez pas, ce n'est pas très gros).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.