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.


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.


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.


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.


2

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


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.