Existe algo como o comando GNU locate no PowerShell?

6

Existe um equivalente do comando locate do GNU no Windows 7/8?

locate pode receber como entrada um nome de arquivo e fornecer como saída todos os caminhos em que os arquivos nomeados de forma semelhante à entrada são, por exemplo:

locate file-with-long-name.txt
/var/www/file-with-long-name.txt
    
por Razor 07.11.2012 / 14:12

3 respostas

7

Não, não há um cmd do Windows ou PowerShell incorporado equivalente ao comando locate do Linux / GNU. No entanto, os equivalentes funcionais incluem dir /s do cmd.exe, conforme descrito por JKarthik , e essas opções do PowerShell:

PS> Get-ChildItem -Recurse . file-with-long-name.txt

Observe o uso de . , dizendo ao PowerShell por onde começar a pesquisa. Você pode, naturalmente, encurtar ao digitar na linha de comando:

PS> gci -r . file-with-long-name.txt

Eu faço muito isso, então adicionei uma função ao meu perfil:

PS> function gcir { Get-ChildItem -Recurse . @args }
PS> gcir file-with-long-name.txt

Isso permite curingas, semelhantes a locate :

PS> gcir [a-z]ooo*.txt

Veja help about_Wildcards para mais detalhes. Isso também pode ser escrito com Where-Object assim:

PS> gcir | where { $_ -like "[a-z]ooo*.txt"}

locate tem uma opção para combinar com expressões regulares. O mesmo acontece com o PowerShell:

PS> gcir | where { $_ -match "A.*B" }

O PowerShell oferece suporte a expressões regulares .NET completas. Veja about_Regular_Expressions .

Você também pode fazer outros tipos de consultas:

PS> gcir | where { $_.Length -gt 50M }  # find files over 50MB in size

O desempenho dessas abordagens é lento para grandes coleções de arquivos, pois apenas procura no sistema de arquivos. O GNU locate usa um banco de dados . O Windows agora tem um banco de dados pesquisável, chamado Windows Desktop Search . Há uma API no WDS, que alguém incluiu em um cmdlet do PowerShell, aqui: link , permitindo coisas como:

PS> get-wds “kind:pics datetaken:this month cameramake:pentax” 

com desempenho muito melhor que Get-ChildItem e esse tipo de consulta avançada (e sintaxe estranha). Além disso, observe que as aspas curvas funcionam bem no PowerShell, portanto, não é necessário editá-las ao copiá-las / colá-las.

Talvez alguém encontre (ou grave) cmdlets do PowerShell que permitam consultas idiomáticas ao WDS.

    
por 07.11.2012 / 15:58
2

Para uma solução do PowerShell, tente isto:

Get-ChildItem -Filter "file-with-long-name.txt" -Recurse

Isso retorna todos os arquivos que correspondem ao nome fornecido no diretório atual e em seus subdiretórios.

O parâmetro -Filter aceita curingas. Se o diretório atual contiver arquivos de sistema aos quais você não tem acesso, adicione -ErrorAction SilentlyContinue para suprimir erros.

Para obter mais informações, consulte Get-Help Get-ChildItem .

    
por 07.11.2012 / 15:48
2

Você pode usar o seguinte comando no shell do Windows:

dir [filename] /s

Em que nome do arquivo é o nome do arquivo que você está procurando e /s refere-se à inclusão de subdiretórios na pesquisa.

Atualizar O comando a seguir com /B mostra apenas o formato simples, exatamente conforme necessário. E isso parece ser um pouco mais rápido.

Tente:

 dir [filename] /s /B

Fonte: Lista e referência de linha de comando do Windows 8

    
por 07.11.2012 / 14:19