Unix-type “locate” no Windows?

13

Usando o Windows CLI (cmd), como alguém pode localizar um arquivo do qual ele sabe parte do nome? Por exemplo, cada estação de trabalho do Windows instala o javac em um local diferente, como alguém poderia encontrá-lo a partir da CLI do Windows (cmd)?

Pesquisando, vejo apenas menção de usar a GUI do Windows Explorer (gerenciador de arquivos) ou baixar algum aplicativo freeware. O Windows realmente não tem um comando locate embutido? As edições do servidor têm isso? Eu faço não quero instalar o cygwin ou qualquer outra coisa, estas normalmente não são minhas máquinas.

    
por dotancohen 23.08.2011 / 21:28

10 respostas

21

Você deve ser capaz de fazer o que precisa fazer com dir :

dir [filename] /s

Substitua [nome do arquivo] pelo nome do arquivo que você está procurando, você deve ser capaz de usar curingas. / s faz com que ele procure por subdiretórios, então, se você precisar, pode começar na raiz de C: e fazer com que ele verifique toda a unidade.

    
por 23.08.2011 / 21:34
4

Windos tem a resposta mais direta. Mas se você gosta da linha de comando, você pode querer olhar para o PowerShell também. Para realizar o mesmo tipo de pesquisa, você usaria

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

Que tem o benefício de ser capaz de ser bombeado para uma declaração foreach e executar um processo contra os resultados da pesquisa.

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..]
    }
    
por 23.08.2011 / 22:05
3

Eu simplesmente tenho um programa de localização para Windows . Você só precisa seguir as instruções leia-me e copiar os arquivos .dll e .exe para o system32.

Alternativa inclui adicionar o caminho do programa à variável de ambiente PATH.

A idéia é conseguir localizar no Windows se você estiver procurando por algo "como" localizar. :)

    
por 23.12.2013 / 08:25
3

Ninguém fala sobre o comando "where"? pesquisa o arquivo executável no PATH do ambiente atual.

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.
    
por 07.09.2018 / 10:56
2

A questão é um tanto ambígua.

Você deseja localizar um arquivo (declarado no corpo do OP), mas também deseja um comando / aplicativo "localizar-tipo" (indicado no título). Há uma consideração sutil com enormes implicações. Você pode localizar com dois métodos diferentes:

  1. Pesquisando a estrutura da árvore de destino diretamente em cada pesquisa (lenta).

  2. Primeiro, crie um banco de dados da estrutura de árvore de destino (pode ser demorado) e, em seguida, localize pesquisando o banco de dados (muito rápido). O banco de dados deve ser atualizado periodicamente para obter bons resultados nas pesquisas. Consulte o link .

Unix locate é do tipo "2", mas de acordo com o corpo do seu OP, você estaria bem com qualquer um dos dois métodos. Além disso, você pergunta especificamente sobre as opções da CLI.

Eu listo abaixo algumas opções e especifico se elas são CLI / GUI, tipo 1/2 e adiciono alguns comentários.

  1. link (já apontado por John T e depois por Cheeku ). GUI, tipo 2. Existe uma versão portátil. Excelente facilidade de uso e configurabilidade. Muito semelhante ao Unix locate (que eu usei e gostei muito).
    Nota : Estando acostumado com Updatedb do Unix demorando bastante para atualizar um banco de dados (claro, isso depende do tamanho da árvore varrida), eu acho locate32 extremamente rápido. Eu não sei como isso pode ser melhorado.

  2. link CLI, tipo 2.

  3. dir [nome do arquivo] / s , a solução da Windos . CLI, tipo 1.

  4. gci ... , a solução da OldWolf . CLI, tipo 1.

  5. link CLI, tipo 2.

  6. Tudo GUI, digite?.

por 06.11.2014 / 15:31
2

Eu criei uma porta do PowerShell para locate e updatedb. Usa o SQLite como backend e possui um instalador automático. Apenas

.\Invoke-Locate.ps1 -install. 

os locais levam cerca de 300 ms / consulta.

Então

locate whatever

e você está pronto.

link

    
por 25.01.2015 / 04:09
2

Não há necessidade de instalar manualmente. Veja o link

choco install winlocate

Reinicie o ambiente do shell

Updatedb.bat -a
Locate.bat somefile
    
por 19.02.2015 / 00:58
2

Eu sei que este foi respondido há muito tempo, no entanto este é o meu script para simular a função de localização usada no unix / linux

Salve isto como locate.bat e coloque no System32 OU execute a partir do diretório em que ele está armazenado. Carrega um parâmetro como este "cmd > locate javac.exe"

A opção localizar / c (como um segundo parâmetro contará o número de instâncias) e localize /? exibirá o texto de ajuda

@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 atualizado, mais organizado e pode lidar com uma variedade maior de situações, como permitir qualquer termo de pesquisa e não apenas um nome de arquivo)

@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
    
por 25.04.2015 / 00:26
0

Para futuros historiadores do espaço Windows: fomos abençoados com a Everything Search . Picture dmenu + find + mlocate transformado em um pequeno e apertado serviço Windows com opções de cli. Exceto que isso atualiza seu índice em tempo real . Nada no Linux chega perto. Será uma das poucas vezes que você vai dizer "caramba, eu desejo que esse kernel seja um pouco mais Microsofty"

    
por 18.12.2017 / 20:01
-3

Não conheço nenhum método CLI para fazer isso no Windows. Lembre-se de que a CLI do Windows foi abandonada por usuários comuns, por isso oferece um conjunto de ferramentas geralmente menos maduro. Sua melhor aposta pode ser usar o gnu find no Windows, que você pode obter do GnuWin32 . Se você está desenvolvendo um script, basta incluir find.exe e suas dependências com o script (não se preocupe, não é muito grande).

    
por 23.08.2011 / 21:32