Odpowiednik polecenia Unix znajdź w systemie Windows

34

Jaki jest odpowiednik polecenia Unix find w systemie Windows?

Widzę, że find.exew systemie Windows jest bardziej jak grep. Szczególnie interesuje mnie odpowiednik

find . -name [filename]
ARV
źródło
2
Czy coś jest nie tak z moją odpowiedzią? Czy mogę to poprawić? Czy nadal potrzebujesz pomocy?
JohannesM
Przepraszam, jakiś czas temu straciłem z oczu ten wątek. Dziękujemy za odpowiedź i przepraszam, że nie zaakceptowałem jej wcześniej.
ARV,

Odpowiedzi:

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

- alternatywa -

dir /s <drive:>\<pattern>

przykład

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

- alternatywa -

dir /s c:\example.txt
JohannesM
źródło
dir c: /s example.txtteż działa.
DevSolar,
@DevSolar czy możesz ponownie sprawdzić swoje polecenie? Przetestowałem to na Windows 5.1 Build 2600 SP3, a twoje polecenie po prostu daje mi listę plików w katalogu c:
JohannesM
1
Uh ... przepraszam. Służy mi do pisania z pamięci. dir /s C:\example.txtto jest.
DevSolar
1
dla najbardziej podobnych wyników używam \bw skrócie (ścieżki wyjściowe tylko); find <folder> -name <pattern>-> dir /s /b <folder><pattern>. Np. find /tmp -name *.txt-> dir \s \b C:\temp\*.txt. dirZawsze jednak zwraca listę ścieżek bezwzględnych, a findzawsze podaje ścieżki z prefiksem<folder>
Hashbrown
28

Polecenie Find-ChildItemcmdlet w programie Windows Powershell jest odpowiednikiem polecenia find w systemie Unix / Linux

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

Niektóre z opcji 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

Ujawnienie: Jestem twórcą polecenia Find-ChildItemcmdlet

Jagadish G.
źródło
2
Dziękuję Ci. Zdecydowanie bardziej chodzi o to, czego szukałem, odpowiadając na to pytanie.
supercheetah
7
Find-ChildItemnie jest oficjalnym poleceniem cmdlet i nie jest zawarte w PowerShell; musisz pobrać to polecenie cmdlet z OneDrive jakiegoś faceta . Nie ma różnicy między tym a pobieraniem bash, cygwin, unixutils lub jakiegokolwiek innego programu, który pozwala na uruchamianie UNIX-a find.
wal 18.04.18
19

Bez zainstalowanych dodatkowych poleceń cmdlet możesz po prostu użyć Get-ChildItem:

Get-ChildItem -Filter *.zip -Recurse $pwd
djhaskin987
źródło
1
W takim przypadku prawdopodobnie chcesz użyć jednej z krótkich aliasów dir, lslub gci, jeśli nie jesteś napisanie skryptu.
Swonkie
5

Jeśli używasz funkcji wyszukiwania Unixa do wyszukiwania plików w hierarchii katalogów, wówczas sposobem Powershell jest użycie polecenia cmdlet Get-ChildItem(alias to gci) i filtrowanie wyników za pomocą polecenia cmdlet Where-Object(alias to where).

Na przykład, aby znaleźć wszystkie pliki (zaczynające się C:\Users\i rekurencyjnie) ze słowem „niezbędny” w nazwie, użyj następującego polecenia:

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

Ta -likeopcja pozwala używać symboli wieloznacznych do dopasowywania wzorców.

Joshua Kan
źródło
2

Ten nie jest dokładnie znalezieniem GNU, ale ściślej pasuje do filozofii wiersza poleceń Linuksa w PowerShell:

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

Przykład:

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

Uwaga: Wszystko zwracane po „|% FullName” jest ciągiem, a nie obiektem.

Możesz także skorzystać z opcji Where Operator, „?”, Jednak jest to więcej pracy i niewiele szybsze:

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

Oto szybki skrót:

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 .
Bill Moore
źródło
Znajdź -exec grep {} z UnixUtils nie działa poprawnie wydaje się, że „nie ma takiego pliku lub katalogu”. To rozwiązanie: PowerShell.exe-Polecenie "katalog -Recurse -ea 0 |? Pełna nazwa-podobny błąd„ * .log "| sls", z poziomu skryptu wsadowego działa. Uwaga: należy stosować pojedyncze cudzysłowy wewnątrz, podwójne cudzysłowy na zewnątrz.
kevinf