Entspricht dem Unix-Befehl find unter Windows

34

Was entspricht dem Unix- Befehl find unter Windows?

Ich sehe, dass das find.exeunter Windows eher wie ein grep. Mich interessiert vor allem das Äquivalent von

find . -name [filename]
ARV
quelle
2
Stimmt etwas mit meiner Antwort nicht? Kann ich es verbessern? Benötigen Sie noch Hilfe?
JohannesM
Entschuldigung, ich hatte diesen Thread vor einiger Zeit aus den Augen verloren. Vielen Dank für Ihre Antwort und entschuldigen Sie, dass Sie sie nicht früher akzeptiert haben.
ARV

Antworten:

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

- alternative -

dir /s <drive:>\<pattern>

Beispiel

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

- alternative -

dir /s c:\example.txt
JohannesM
quelle
dir c: /s example.txtfunktioniert auch.
DevSolar
@ DevSolar können Sie Ihren Befehl erneut überprüfen? Ich habe es unter Windows 5.1 Build 2600 SP3 getestet, und Ihr Befehl gibt mir nur die Liste der Dateien im Verzeichnis c:
JohannesM
1
Äh ... Entschuldigung. Dient mir richtig aus dem Gedächtnis zu tippen. dir /s C:\example.txtes ist.
DevSolar
1
für die ähnlichsten Ergebnisse verwende ich \bkurz (nur Pfade ausgeben); find <folder> -name <pattern>-> dir /s /b <folder><pattern>. ZB find /tmp -name *.txt-> dir \s \b C:\temp\*.txt. Es wird jedoch dirimmer eine Liste absoluter Pfade zurückgegeben, wohingegen findPfade mit dem Präfix "<folder>
Hashbrown
28

Das Find-ChildItemCmdlet in Windows PowerShell entspricht dem Befehl find unter Unix / Linux

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

Einige der Find-ChildItem-Optionen

  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

Offenlegung: Ich bin der Entwickler von Find-ChildItemCmdlet

Jagadish G
quelle
2
Vielen Dank. Dies ist definitiv mehr im Sinne dessen, wonach ich bei der Beantwortung dieser Frage suchen würde.
Supercheetah
7
Find-ChildItemist kein offizielles Cmdlet und nicht in PowerShell enthalten. Sie müssen dieses Cmdlet von OneDrive eines Typen herunterladen . Es gibt keinen Unterschied zwischen dem Herunterladen von Bash, Cygwin, Unixutils oder einem anderen Programm, mit dem Sie nur UNIX ausführen können find.
Walen
19

Ohne zusätzliche installierte Cmdlets können Sie einfach Folgendes verwenden Get-ChildItem:

Get-ChildItem -Filter *.zip -Recurse $pwd
djhaskin987
quelle
1
In diesem Fall möchten Sie wahrscheinlich eine der kurzen Aliasnamen verwenden dir, lsoder gci, wenn Sie ein Skript schreiben.
Swonkie
5

Wenn Sie mit der Unix-Suche nach Dateien in einer Verzeichnishierarchie suchen, können Sie das Cmdlet Get-ChildItem(alias is gci) in Powershell verwenden und die Ergebnisse mit dem Cmdlet Where-Object(alias is where) filtern.

C:\Users\Verwenden Sie beispielsweise Folgendes , um alle Dateien (beginnend mit und rekursiv) mit dem Wort "essential" im Namen zu suchen :

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

Mit dieser -likeOption können Sie Platzhalter für den Mustervergleich verwenden.

Joshua Kan
quelle
2

Dies ist keine GNU-Entdeckung, sondern entspricht eher der Linux-Kommandozeilenphilosophie unter Powershell:

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

Beispiel:

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

Hinweis: Alles, was nach "|% FullName" zurückgegeben wird, ist eine Zeichenfolge anstelle eines Objekts.

Sie können auch den Where-Operator "?" Verwenden. Dies ist jedoch arbeitsintensiver und nicht viel schneller:

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

Hier ist eine kurze Verknüpfung:

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
quelle
Find -exec grep {} von UnixUtils funktioniert nicht richtig, es scheint "keine solche Datei oder kein solches Verzeichnis". Diese Lösung: PowerShell.exe -Befehl "dir -Recurse -ea 0 |? FullName -wie '* .log' | sls error", aus einem Batch-Skript funktioniert. Hinweis: Es müssen einfache Anführungszeichen verwendet werden, doppelte Anführungszeichen außerhalb.
Kevinf