Esiste qualcosa come il comando di localizzazione GNU in PowerShell?


8

Esiste un equivalente del locatecomando GNU in Windows 7/8?

locate può prendere come input un nome file e fornisce come output tutti i percorsi in cui i file denominati in modo simile all'input sono, ad esempio:

locate file-with-long-name.txt
/var/www/file-with-long-name.txt

Per quelli di noi che non lo sanno locate, puoi descrivere cosa vuoi che faccia?
Jay Bazuzi,

@JayBazuzi L'ho fatto anche se era evidentemente meno che chiaro, modificato per chiarire e aggiunto l'output del campione
Razor

Cosa significa "simile"?
Jay Bazuzi,

Non hai detto, ma suppongo che tu intenda localizzare GNU. Modificherò la tua domanda.
Jay Bazuzi,

@JayBazuzi ad es. Alla ricerca di index.htm trova anche index.html
Razor

Risposte:


7

No, non c'è un cmd di Windows PowerShell o incorporato equivalente a Linux / GNU locatecomando. Tuttavia, gli equivalenti funzionali includono cmd.exe dir /scome descritto da JKarthike queste opzioni di PowerShell:

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

Nota l'uso di ., dicendo a PowerShell da dove iniziare la ricerca. Ovviamente puoi accorciare digitando dalla riga di comando:

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

Lo faccio molto, quindi ho aggiunto una funzione al mio profilo:

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

Ciò consente caratteri jolly, simili a locate:

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

Vedi help about_Wildcardsper maggiori dettagli. Questo può anche essere scritto in Where-Objectquesto modo:

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

locateha un'opzione per abbinare con regexes. Anche PowerShell:

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

PowerShell supporta espressioni regolari .NET complete. Vedere about_Regular_Expressions.

Puoi fare anche altri tipi di query:

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

Le prestazioni di questi approcci sono lente per grandi raccolte di file, poiché effettuano solo ricerche nel filesystem. GNU locateutilizza un database . Windows ora ha un database di ricerca, chiamato Ricerca desktop di Windows . Esiste un'API per WDS, che qualcuno ha racchiuso in un cmdlet di PowerShell, qui: http://www.codeproject.com/Articles/14602/Windows-Desktop-Search-Powershell-Cmdlet , che consente cose come:

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

con prestazioni molto migliori di Get-ChildIteme questo tipo di query complesse (e sintassi scomoda). Inoltre, nota che le virgolette ricci funzionano bene in PowerShell, quindi non è necessario modificare quell'esempio quando lo copi / incolli.

Forse qualcuno troverà (o scriverà) i cmdlet di PowerShell che consentono query idiomatiche su WDS.


2

Per una soluzione PowerShell, prova questo:

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

Ciò restituisce tutti i file che corrispondono al nome specificato nella directory corrente e nelle sue sottodirectory.

Il -Filterparametro accetta caratteri jolly. Se la directory corrente contiene file di sistema a cui non hai accesso, aggiungi -ErrorAction SilentlyContinueper eliminare gli errori.

Per ulteriori informazioni, vedere Get-Help Get-ChildItem.


1
Al prompt dei comandi, abbrevia -ErrorAction SilentlyContinueper -ea 0, per facilitare la digitazione.
Jay Bazuzi,

Questa risposta è meglio anticipata con un avvertimento sull'enorme differenza tra locate(che esamina un database precedentemente generato, con il pro della velocità e il contro del non essere istantaneamente aggiornato) e Get-ChildItem.
sancho.s,

2

È possibile utilizzare il seguente comando sulla shell di Windows:

dir [filename] /s

Dove nomefile è il nome del file che stai cercando e si /sriferisce ad includere sottodirectory nella ricerca.

Aggiorna Il seguente comando con /Bmostra solo il formato nudo, esattamente come richiesto. E questo sembra essere un po 'più veloce.

Prova:

 dir [filename] /s /B

Fonte: elenco e riferimenti della riga di comando di Windows 8


questo è quasi lento rispetto a Linux, ma alla fine trova il file. Lo segnerà come risposta se nessun altro trova un'alternativa più veloce
Razor

1
Ehi, / B viene visualizzato in formato nudo (solo la posizione del file) e questo sembra essere un po 'più veloce. Controlla.
tempidope,

La differenza è che localecerca in un database (genera / aggiornato da updatedb) e dircerca effettivamente l'intero disco rigido.
Joachim Sauer,

1
dir/sè lento perché forza la ricerca bruta (guarda dappertutto ). Torna al DOS (essendo un comando DOS), motivo per cui funziona in questo modo. Ho il sospetto che l'unica ragione per cui esiste ancora sia un fallback nel caso in cui il database dell'indice non sia adeguato.
Ben Richards,

Questa risposta è meglio anticipata con un avvertimento sull'enorme differenza tra locate(che esamina un database precedentemente generato, con il pro della velocità e il contro del non essere istantaneamente aggiornato) e Get-ChildItem.
sancho.s,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.