Equivalente di Unix trova il comando su Windows


34

Qual è l'equivalente del comando find Unix su Windows?

Vedo che find.exesu Windows è più simile a grep. Sono particolarmente interessato all'equivalente di

find . -name [filename]

2
C'è qualcosa che non va nella mia risposta? Posso migliorarlo? Hai ancora bisogno di aiuto?
JohannesM,

Scusa, avevo perso di vista questa discussione un po 'di tempo fa. Grazie per la risposta e mi scuso per non averlo accettato prima.
ARV,

Risposte:


21
dir <drive: [drive:]> /s | findstr /i <pattern>

- alternativa -

dir /s <drive:>\<pattern>

esempio

dir c: d: /s | findstr /i example.txt

- alternativa -

dir /s c:\example.txt

dir c: /s example.txtfunziona anche.
DevSolar,

@DevSolar puoi ricontrollare il tuo comando? L'ho provato su Windows 5.1 Build 2600 SP3 e il tuo comando mi dà solo l'elenco dei file nella directory c:
JohannesM

1
Uh ... scusa. Mi serve bene digitare dalla memoria. dir /s C:\example.txtè.
DevSolar,

1
per i risultati più simili che uso \bper brevi (percorsi solo output); find <folder> -name <pattern>-> dir /s /b <folder><pattern>. Ad esempio find /tmp -name *.txt-> dir \s \b C:\temp\*.txt. Tuttavia dirrestituisce sempre un elenco di percorsi assoluti, mentre findfornisce sempre percorsi con prefisso<folder>
Hashbrown,

28

Il Find-ChildItemCmdlet in Windows Powershell è un equivalente del comando find di Unix / Linux

http://windows-powershell-scripts.blogspot.in/2009/08/unix-linux-find-equivalent-in.html

Alcune opzioni di Find-ChildItem

  1. Find-ChildItem -Type f -Name ".*.exe"
  2. Find-ChildItem -Type f -Name "\.c$" -Exec "Get-Content {} | Measure-Object -Line -Character -Word"
  3. Find-ChildItem -Type f -Empty
  4. Find-ChildItem -Type f -Empty -OutObject
  5. Find-ChildItem -Type f -Empty -Delete
  6. Find-ChildItem -Type f -Size +9M -Delete
  7. Find-ChildItem -Type d
  8. Find-ChildItem -Type f -Size +50m -WTime +5 -MaxDepth 1 -Delete

Divulgazione: sono lo sviluppatore del Find-ChildItemcmdlet


2
Grazie. Questo è sicuramente più in mente di ciò che avrei cercato di rispondere a questa domanda.
supercheetah

7
Find-ChildItemnon è un cmdlet ufficiale e non è incluso in PowerShell; devi scaricare questo cmdlet dal OneDrive di alcuni ragazzi . Non c'è alcuna differenza tra questo e il semplice download di bash, cygwin, unixutils o qualsiasi altro programma che ti consente di eseguire UNIX find.
walen

19

Senza cmdlet aggiuntivi installati, è possibile utilizzare semplicemente Get-ChildItem:

Get-ChildItem -Filter *.zip -Recurse $pwd

1
Nel qual caso probabilmente si desidera utilizzare uno dei brevi alias dir, lso gci, a meno che non si sta scrivendo uno script.
Swonkie,

5

Se si utilizza Unix's find per cercare i file in una gerarchia di directory, il modo Powershell è utilizzare il cmdlet Get-ChildItem(alias is gci) e filtrare i risultati con il cmdlet Where-Object(alias is where).

Ad esempio, per trovare tutti i file (a partire da C:\Users\e ricorsivamente) con la parola "essenziale" nel suo nome, utilizzare quanto segue:

PS> gci -Path "C:\Users\"  -Recurse | where {$_.Name -like '*essential*'}

L' -likeopzione consente di utilizzare i caratteri jolly per la corrispondenza dei motivi.


2

Questo non è esattamente GNU find, ma corrisponde più da vicino alla filosofia della riga di comando di Linux sotto PowerShell:

PS> dir -recurse -ea 0 | % FullName | sls <grep_string>

Esempio:

PS> cd C:\
PS> dir -recurse -ea 0 | % FullName | sls "Program" | sls "Microsoft"
PS> dir -recurse -ea 0 | % FullName | sls "Program" | sls "Microsoft" | out-gridview

Nota: tutto ciò che viene restituito dopo "|% FullName" è una stringa, anziché un oggetto.

Puoi anche usare l'operatore Where, "?", Tuttavia, è più lavoro e non molto più veloce:

PS> cd C:\
PS> dir -Recurse -ea 0 | ? FullName -like "*Program*" 
                       | ? FullName -like "*Microsoft*" 
                       | % FullName 
                       | out-gridview

Ecco una scorciatoia veloce:

PS> function myfind {dir -recurse -ea 0 | % FullName | sls $args }

PS> cd C:\
PS> myfind "Programs" | sls "Microsoft"

#find all text files recursively from current directory
PS> myfind "\.txt$"

#find all files recursively from current directory
PS> myfind .

Trova -exec grep {} da UnixUtils non funziona correttamente, sembra "nessun file o directory". Questa soluzione: PowerShell.exe -Command "dir -Recurse -ea 0 |? FullName -like '* .log' | sls error", all'interno di uno script batch funziona. Nota: è necessario utilizzare virgolette singole all'interno, doppie virgolette all'esterno.
kevinf,
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.