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]

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

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


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

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.


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 .

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.