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/Debug
po prostu dałby mi listę wszystkich rzeczy DirA/bin/Debug
i pokazał, że DirB/bin/Debug
jest 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.
źródło
Odpowiedzi:
Coś takiego powinno robić to, co chcesz. W katalogu głównym typu projektu:
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.
źródło
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ódło
unxutils ma polecenie ls. Jednak problem dotyczy powłoki Windows. W Uniksie twoja powłoka rozwinie
*/bin/Debug
się 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.
źródło
Możesz zrobić coś takiego jak „dir / s * .obj * lib”. Na końcu poda podsumowanie liczby pasujących plików.
źródło
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
źródło
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.
źródło