Windows-Äquivalent zu ls * (Sternchen) -Verzeichnis-Platzhaltern?

14

Eine weitere Frage von einem langjährigen Unix / Linux-Benutzer, der sich in einer Windows-Welt befindet. Lassen Sie mich zunächst genau erklären, was ich zu tun versuche. Ich verwende die Windows-Shell cmd.exe und möchte alle Verzeichnisse unter dem aktuellen Verzeichnis auflisten, die eine bin \ Debug-Hierarchie enthalten, und feststellen, ob sie Dateien enthalten (z funktioniert richtig). Meine Hierarchie könnte ungefähr so ​​aussehen:

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

ls */bin/DebugWürde mir in Unix nur eine Liste aller Sachen geben DirA/bin/Debugund mir zeigen, dass diese DirB/bin/Debugleer sind. Ich habe verschiedene Verrenkungen in der Cmd-Shell ausprobiert, aber immer wieder mit Dingen wie:

    > dir * \ bin \ Debug
    Der Dateiname, der Verzeichnisname oder die Datenträgerbezeichnungssyntax sind falsch.

    > dir * \ * \ *
    Der Dateiname, der Verzeichnisname oder die Datenträgerbezeichnungssyntax sind falsch.

Gibt es etwas Feines, das ich nicht verstehe, oder ist es nur so begrenzt?

Ja, mir ist klar, dass ich einfach zum Explorer wechseln, navigieren, mit der rechten Maustaste klicken und möglicherweise eine Suche erstellen kann, die genau das tut, was ich will, aber ich bin mehr an der Quick-n-Dirty-Befehlszeilenlösung interessiert.

Oger Psalm33
quelle
Es ist zwar gut, über alle Unix-ähnlichen Tools Bescheid zu wissen, die ich zu Windows hinzufügen kann (und ich glaube, ich verwende Cygwin zu Hause!), Aber ich werde sie nicht immer zur Verfügung haben, wo immer ich bin (und möglicherweise auch nicht über Administratorrechte verfügen) Installiere sie auf jedem PC, den ich benutze.
Ogre Psalm33

Antworten:

13

So etwas sollte tun, was Sie wollen. Im Stammverzeichnis des Projekttyps:


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

Dir-Argumente: / s - rekursiv, / b - "blank", keine zusätzlichen Informationen
findstr-Argumente: / i - Groß- / Kleinschreibung ignorieren

Im Allgemeinen zeigt der Befehl 'help ' die Hilfe für die Shell-Befehle an. Wenn das nicht funktioniert, dann
' command /?' wird in der Regel Hilfe zeigen.

James
quelle
Ausgezeichnet! Mir ist klar, dass es viele Tools / Toolkits gibt, die mir helfen, mein Windows zu "linuxieren", aber ich habe nach der Windows-Methode gesucht, um das zu tun, was ich versuche, und genau das ist es!
Ogre Psalm33
7

Windows verwendet keine Platzhalter wie Linux. Nur der Dateinamenteil kann Platzhalter enthalten.

Sie können eine Version von ls herunterladen, die unter Windows ausgeführt wird, und diese verwenden. Ich habe Cygwin benutzt , aber ich bin mir sicher, dass es noch andere gibt.

Mark Ransom
quelle
Also PowerShell
Joel Coehoorn
3
Noch etwas zu beachten: In Windows werden Platzhalter durch den Befehl und nicht durch die Shell erweitert.
Laurence Gonsalves
2

unxutils hat einen ls Befehl. Das Problem liegt jedoch wirklich in der Windows-Shell. Unter Unix erweitert Ihre Shell */bin/Debugdie relevanten Pfadnamen und gibt sie als separate Befehlszeilenargumente an den Befehl ls weiter.

Cygwin würde sicherlich den Trick für Sie tun, oder Sie könnten einen Windows-Port einer Unix-Shell wie Bash ausprobieren . Wenn Sie sich für Skripte interessieren, können Sie mit dem Glob-Modul ganz einfach etwas in Python programmieren , und die meisten anderen Skriptsprachen haben ein Äquivalent.

Tim Gilbert
quelle
2

Sie können so etwas wie "dir / s * .obj * lib" machen. Am Ende wird eine Zusammenfassung angezeigt, wie viele Dateien übereinstimmen.

Joel Lucsy
quelle
Schließen. Ich habe dir Requisiten gegeben, aber James 'Antwort ist näher, da es die Dateien herausfiltert, die nicht unter \ debug für mich sind.
Ogre Psalm33
2
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

Nicht schön, sollte aber funktionieren. Sie können auch eine .cmd-Datei erstellen (dann jedes einzelne% durch doppeltes %% ersetzen). Oder definieren Sie ein Makro mit doskey (ja, es existiert noch).

Stellen Sie sicher, dass die cmd-Erweiterungen aktiviert sind.

EDIT: Wie es funktioniert:

Die erste for-Schleife durchläuft alle Unterverzeichnisse (/ D und / r) iterativ. % ~ fP wird auf den vollständigen Pfad dieses Verzeichnisses erweitert. Dann wird \ bin \ Debug * an diesen Pfad angehängt. Die zweite for-Schleife listet alle übereinstimmenden Dateien auf. % ~ ftzaQ wird auf jede Dateiübereinstimmung erweitert und per Echo auf den Bildschirm gedruckt. Das seltsame% ~ ftzaQ formatiert es wie eine Dir-Ausgabe. Das @ -Zeichen verhindert, dass die Befehle selbst auf dem Bildschirm gedruckt werden.

Für mehr sehen Sie

Meinersbur
quelle
Ich habe es versucht und tatsächlich funktioniert es. Da ich aber in der cmd-Shell etwas unerfahren bin, verstehe ich noch nicht alles :-).
Ogre Psalm33
0

In der Windows-Welt erweitert cmd.exe keine Platzhalter - sie werden unverändert an das Programm in der Befehlszeile oder im argv-Array übergeben. Daher werden sie von jedem Programm unterschiedlich analysiert und erweitert, und einige der fortgeschritteneren Anwendungen (wie Sie sie suchen) werden im Allgemeinen nicht unterstützt.

timgilberts Vorschlag , Cygwin zu verwenden, ist gut, auch das GNUWin32-Paket könnte etwas enthalten, das Ihnen helfen wird.

Michael Burr
quelle