System Windows zastępuje symbole wieloznaczne katalogu * (gwiazdka)?

14

Kolejne pytanie od długoletniego użytkownika Unix / Linux, który znajduje się w świecie Windows. Najpierw pozwól mi dokładnie wyjaśnić, co próbuję zrobić. Korzystam z powłoki cmd.exe systemu Windows i chcę wyświetlić listę wszystkich katalogów poniżej bieżącego katalogu, które zawierają hierarchię bin \ Debug, i ustalić, czy zawierają one jakieś pliki (np. Próbując dowiedzieć się, czy mój czysty cel NAnt to działa prawidłowo). Moja hierarchia może wyglądać mniej więcej tak:

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

W Unixie ls */bin/Debugpo prostu dałby mi listę wszystkich rzeczy DirA/bin/Debugi pokazał, że DirB/bin/Debugjest pusty. Próbowałem różnych zniekształceń w powłoce cmd, ale wciąż kończę na takich rzeczach jak:

    > katalog * \ bin \ Debug
    Nazwa pliku, nazwa katalogu lub składnia etykiety woluminu jest niepoprawna.

    > katalog * \ * \ *
    Nazwa pliku, nazwa katalogu lub składnia etykiety woluminu jest niepoprawna.

Czy jest coś subtelnego, czego nie rozumiem w poleceniu dir, czy jest to po prostu ograniczone w ten sposób?

Tak, zdaję sobie sprawę, że mogę po prostu przejść do Eksploratora, nawigować, kliknąć prawym przyciskiem myszy i prawdopodobnie w końcu stworzyć wyszukiwanie, które zrobi to, co chcę, ale bardziej interesuje mnie szybkie i brudne rozwiązanie wiersza polecenia.

Ogre Psalm 33
źródło
Chociaż miło jest wiedzieć o wszystkich uniksowych narzędziach, które mogę dodać do systemu Windows (i wierz mi, że korzystam z Cygwin w domu!), Nie zawsze będę mieć je wszędzie, gdziekolwiek pójdę (i rzeczywiście może nie mieć uprawnień administratora do zainstaluj je na każdym komputerze, którego używam).
Ogre Psalm 33

Odpowiedzi:

13

Coś takiego powinno robić to, co chcesz. W katalogu głównym typu projektu:


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

Dir arguments: / s - recursive, / b - "bare", bez dodatkowych informacji
findstr arguments: / i - ignore case

Zasadniczo „ polecenie pomocy ” pokaże pomoc dotyczącą poleceń powłoki. Jeśli to nie zadziała, to
command /?” ogólnie pokaże pomoc.

James
źródło
Doskonały! Zdaję sobie sprawę, że istnieje wiele narzędzi / zestawów narzędzi, które pomagają mi „linuksować” mój system Windows, ale szukałem sposobu Windows do robienia tego, co próbuję zrobić, i to jest dokładnie to!
Ogre Psalm 33
7

Windows nie używa symboli wieloznacznych jak Linux. Tylko część nazwy pliku może zawierać symbole wieloznaczne.

Możesz pobrać wersję ls działającą w systemie Windows i używać jej. Użyłem Cygwina , ale jestem pewien, że są inne.

Mark Ransom
źródło
Również PowerShell
Joel Coehoorn
3
Kolejna rzecz, o której należy pamiętać: w systemie Windows symbole wieloznaczne są rozszerzane przez polecenie, a nie przez powłokę.
Laurence Gonsalves
2

unxutils ma polecenie ls. Jednak problem dotyczy powłoki Windows. W Uniksie twoja powłoka rozwinie */bin/Debugsię do odpowiednich ścieżek i poda je do komendy ls jako osobne argumenty wiersza poleceń.

Cygwin z pewnością zrobiłby to za Ciebie, lub możesz wypróbować port systemu Windows w powłoce uniksowej, taki jak bash . Jeśli chcesz iść drogą skryptową, możesz dość łatwo napisać coś w Pythonie, używając modułu glob , a większość innych języków skryptowych ma odpowiednik.

Tim Gilbert
źródło
2

Możesz zrobić coś takiego jak „dir / s * .obj * lib”. Na końcu poda podsumowanie liczby pasujących plików.

Joel Lucsy
źródło
Blisko. Dałem ci rekwizyty, ale odpowiedź Jamesa jest bliższa, ponieważ odfiltrowuje pliki, które nie są dla mnie \ debugowane.
Ogre Psalm 33
2
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

Nie fajnie, ale powinno działać. Możesz również wstawić do pliku .cmd (następnie zamienić każdy pojedynczy% na podwójny %%). Lub zdefiniuj makro za pomocą doskey (tak, nadal istnieje).

Upewnij się, że rozszerzenia cmd są włączone.

EDYCJA: Jak to działa:

Pierwsza pętla for iteruje iteracyjnie wszystkie podkatalogi (przełącznik / D i / r). % ~ fP rozwija się do pełnej ścieżki tego katalogu. Następnie dołącza \ bin \ Debug * do tej ścieżki. Druga pętla for wylicza wszystkie pasujące pliki. % ~ ftzaQ jest rozwijany do każdego pasującego pliku i drukowany na ekranie za pomocą echa. Dziwny% ~ ftzaQ formatuje go jak wyjście katalogu. Znak @ pozwala uniknąć drukowania samych poleceń na ekranie.

Aby uzyskać więcej informacji, zobacz

Meinersbur
źródło
Próbowałem tego i rzeczywiście działa. Ale będąc nieco niedoświadczonym w powłoce cmd, nie do końca to wszystko rozumiem :-).
Ogre Psalm33
0

W świecie Windows cmd.exe nie rozwija symboli wieloznacznych - są one przekazywane „tak jak są” do programu w wierszu poleceń lub w tablicy argv. Dlatego każdy program analizuje i rozwija je w różny sposób, a niektóre bardziej zaawansowane zastosowania (takie jak szukasz) na ogół nie są obsługiwane.

Sugestia timgilberta, by użyć Cygwina, jest dobra, również pakiet GNUWin32 może mieć coś, co może ci pomóc.

Michael Burr
źródło