Équivalent Windows du caractère générique du répertoire ls * (astérisque)?


14

Une autre question d'un utilisateur de longue date d'Unix / Linux qui se retrouve dans un monde Windows. Permettez-moi d'abord d'expliquer exactement ce que j'essaie de faire. J'utilise le shell Windows cmd.exe et je veux répertorier tous les répertoires sous le répertoire actuel qui contiennent une hiérarchie bin \ Debug et déterminer s'ils contiennent des fichiers (par exemple: essayer de déterminer si ma cible propre NAnt est fonctionner correctement). Ma hiérarchie pourrait ressembler à ceci:

\Current
    \DirA
         \bin
             \Debug
                  (some files under debug)
             \Release
    \DirB
         \bin
             \Debug
    \DirC
         \bin
             \Release

Sous Unix, ls */bin/Debugme donnerait juste une liste de tous les trucs dedans DirA/bin/Debug, et me montrerait le fait qui DirB/bin/Debugest vide. J'ai essayé différentes contorsions dans le shell cmd, mais continuez à vous retrouver avec des trucs comme:

    > dir * \ bin \ Debug
    Le nom de fichier, le nom de répertoire ou la syntaxe d'étiquette de volume est incorrect.

    > dir * \ * \ *
    Le nom de fichier, le nom de répertoire ou la syntaxe d'étiquette de volume est incorrect.

Y a-t-il quelque chose de subtil que je ne comprends pas à propos de la commande dir, ou est-ce juste limité de cette façon?

Oui, je me rends compte que je peux simplement basculer vers l'explorateur, naviguer, cliquer avec le bouton droit et probablement éventuellement créer une recherche qui fait ce que je veux, mais je suis plus intéressé par la solution de ligne de commande quick-n-dirty.


Bien qu'il soit agréable de connaître tous les outils de type Unix que je peux ajouter à Windows (et croyez-moi, j'utilise Cygwin à la maison!), Je ne les aurai pas toujours disponibles partout où je vais (et en effet, je n'ai peut-être pas le droit d'administrateur sur installez-les sur chaque PC que j'utilise).
Ogre Psalm33

Réponses:


13

Quelque chose comme ça devrait faire ce que vous voulez. Dans le répertoire racine du type de projet:


c:\path\to\slndir>dir *.dll *.exe /s /b | findstr /i "bin\debug"

Arguments dir: / s - récursif, / b - "nu", pas d'informations supplémentaires
findstr arguments: / i - ignorer la casse

En général, la « commande d' aide » affichera l'aide pour les commandes shell. Si cela ne fonctionne pas, alors
' commande /?' montrera généralement de l'aide.


Excellent! Je me rends compte qu'il existe de nombreux outils / boîtes à outils pour m'aider à "linuxiser" mon Windows, mais je cherchais la façon dont Windows pouvait faire ce que j'essayais de faire, et c'est exactement ça!
Ogre Psalm33

7

Windows ne fait pas de caractères génériques comme le fait Linux. Seule la partie du nom de fichier peut contenir des caractères génériques.

Vous pouvez télécharger une version de ls qui s'exécute sur Windows et l'utiliser. J'ai utilisé Cygwin , mais je suis sûr qu'il y en a d'autres.


Aussi PowerShell
Joel Coehoorn

3
Une autre chose à garder à l'esprit: dans Windows, les caractères génériques sont développés par la commande, pas par le shell.
Laurence Gonsalves

2

unxutils a une commande ls. Le problème est vraiment avec le shell Windows, cependant. Sous Unix, votre shell se développera */bin/Debugdans les chemins d'accès appropriés et les transmettra à la commande ls en tant qu'arguments de ligne de commande distincts.

Cygwin ferait certainement l'affaire pour vous, ou vous pourriez essayer un port Windows d'un shell Unix tel que bash . Si vous vouliez suivre la route des scripts, vous pourriez coder quelque chose en python assez facilement en utilisant le module glob , et la plupart des autres langages de script ont un équivalent.


2

Vous pouvez faire quelque chose comme "dir / s * .obj * lib". Il donnera un résumé à la fin du nombre de fichiers correspondant.


Fermer. Je vous ai donné des accessoires, mais la réponse de James est plus proche, car elle filtre les fichiers qui ne sont pas sous \ debug pour moi.
Ogre Psalm33

2
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

Pas sympa, mais ça devrait marcher. Vous pouvez également mettre dans un fichier .cmd (puis remplacer chaque% unique en double %%). Ou définissez une macro à l'aide de doskey (oui, elle existe toujours).

Assurez-vous que les extensions cmd sont activées.

EDIT: Comment cela fonctionne:

La première boucle for parcourt tous les sous-répertoires (commutateur / D et / r) de manière itérative. % ~ fP se développe sur le chemin complet de ce répertoire. Ensuite, il ajoute \ bin \ Debug * à ce chemin. La seconde boucle for énumère tous les fichiers qui correspondent. % ~ ftzaQ est étendu à chaque correspondance de fichier et imprimé à l'écran par écho. L'étrange% ~ ftzaQ le formate comme une sortie dir. Le caractère @ évite que les commandes elles-mêmes soient imprimées à l'écran.

Pour en savoir plus, voir


J'ai essayé cela et en effet ça marche. Mais étant un peu inexpérimenté dans le shell cmd, je ne comprends pas encore tout :-).
Psaume Ogre33

0

Dans le monde Windows, cmd.exe ne développe pas les caractères génériques - ils sont transmis tels quels au programme dans sa ligne de commande ou son tableau argv. Par conséquent, chaque programme les analyse et les développe différemment, et certaines des utilisations les plus avancées (comme celles que vous recherchez) ne sont généralement pas prises en charge.

La suggestion de timgilbert d'utiliser Cygwin est bonne, aussi le paquet GNUWin32 pourrait avoir quelque chose qui vous aidera.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.