Équivalent de la commande Unix find sur Windows

34

Quel est l'équivalent de la commande Unix find sous Windows?

Je vois que find.exesur Windows ressemble plus à un grep. Je suis particulièrement intéressé par l'équivalent de

find . -name [filename]
ARV
la source
2
Quelque chose ne va pas avec ma réponse? Puis-je l'améliorer? Avez-vous encore besoin d'aide?
JohannesM
Désolé, j'avais perdu de vue ce fil il y a un moment. Merci pour votre réponse et excuses de ne pas l'accepter plus tôt.
ARV

Réponses:

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

- alternative -

dir /s <drive:>\<pattern>

Exemple

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

- alternative -

dir /s c:\example.txt
JohannesM
la source
dir c: /s example.txtfonctionne aussi.
DevSolar
@DevSolar pouvez-vous revérifier votre commande? Je l'ai testé sur Windows 5.1 Build 2600 SP3, et votre commande me donne juste la liste des fichiers dans le répertoire c:
JohannesM
1
Euh ... désolé. Me sert bien de taper de mémoire. dir /s C:\example.txtc'est.
DevSolar
1
pour les résultats les plus similaires que j'utilise \bpour les brèves (sortie uniquement les chemins); find <folder> -name <pattern>-> dir /s /b <folder><pattern>. Par exemple find /tmp -name *.txt-> dir \s \b C:\temp\*.txt. Cependant, dirrenvoie toujours une liste de chemins absolus, tandis que findtoujours donne les chemins préfixés par<folder>
Hashbrown
28

L' Find-ChildItemapplet de commande dans Windows Powershell est un équivalent de la commande find Unix / Linux

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

Certaines des options 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

Divulgation: je suis le développeur de Find-ChildItemcmdlet

Jagadish G
la source
2
Merci. C'est certainement plus à l'esprit de ce que je chercherais à répondre à cette question.
supercheetah
7
Find-ChildItemn'est pas une applet de commande officielle et n'est pas incluse dans PowerShell; vous devez télécharger cette applet de commande à partir du lecteur OneDrive d'un gars . Il n'y a aucune différence entre cela et le téléchargement de bash, cygwin, unixutils ou tout autre programme qui vous permet simplement d'exécuter UNIX find.
walen
19

Sans applets de commande supplémentaires installées, vous pouvez simplement utiliser Get-ChildItem:

Get-ChildItem -Filter *.zip -Recurse $pwd
djhaskin987
la source
1
Dans ce cas, vous souhaiterez probablement utiliser l'un des alias courts dir, lsou gci, sauf si vous écrivez un script.
Swonkie
5

Si vous utilisez la recherche d'Unix pour rechercher des fichiers dans une hiérarchie de répertoires, la méthode Powershell consiste à utiliser l' applet de commande Get-ChildItem(alias est gci) et à filtrer les résultats avec l' applet de commande Where-Object(alias est where).

Par exemple, pour rechercher tous les fichiers (à partir de C:\Users\et récursivement) avec le mot «essentiel» dans son nom, utilisez ce qui suit:

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

L' -likeoption vous permet d'utiliser des caractères génériques pour la correspondance des modèles.

Joshua Kan
la source
2

Celui-ci n'est pas exactement une trouvaille GNU, mais correspond plus étroitement à la philisophie de ligne de commande Linux sous PowerShell:

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

Exemple:

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

Remarque: Tout ce qui est retourné après "|% FullName" est une chaîne, au lieu d'un objet.

Vous pouvez également utiliser l'opérateur Where, "?", Cependant, c'est plus de travail, et pas beaucoup plus rapidement:

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

Voici un raccourci rapide:

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
la source
Trouver -exec grep {} d'UnixUtils ne fonctionne pas correctement, il ne semble "pas un tel fichier ou répertoire". Cette solution: PowerShell.exe -Commande "dir -Recurse -ea 0 |? FullName -like '* .log' | sls error", à partir d'un script de batch fonctionne. Remarque: doit utiliser des guillemets simples à l'intérieur, des guillemets doubles à l'extérieur.
kevinf