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.