Windows CMD: symbol wieloznaczny „dir * .cpp” pasuje do „main.cpp_” i „main.cpp2” [duplikat]


1

To pytanie ma już tutaj odpowiedź:

Oto zawartość katalogu:

λ dir /b "..\src\"
main.c
main.c_
main.c2
main.cpp
main.cpp_
main.cpp2

Działa to zgodnie z oczekiwaniami:

λ dir /b "..\src\*.c"
main.c

To nie:

λ dir /b "..\src\*.cpp"
main.cpp
main.cpp_
main.cpp2

Dlaczego ten symbol wieloznaczny jest zgodny? main.cpp_ i main.cpp2 ?

Co to jest działające rozwiązanie do wyświetlania tylko plików * .cpp w katalogu?

EDYCJA: nie jest duplikatem cmd ma błąd wieloznaczny?


1
Prawdopodobnie istnieją również inne potencjalne duplikaty; Polecam przeglądanie pytań oznaczone „znakami wieloznacznymi” .
— a CVn

Długie nazwy plików, znaki NTFS i legalne nazwy plików - „Włącz lub wyłącz nazwy plików 8.3 w NTFS ... [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] NtfsDisable8dot3NameCreation=1 aby wyłączyć - domyślnie jest włączone.
— DavidPostill

Nie ma błędu. Jak wyjaśniono. Składnia, której używasz, zachowuje się tak, jak została zaprojektowana. Tytuł duplikatu jest słaby, ponieważ nie ma błędu, ale jest duplikatem.
— Ramhound

Odpowiedzi:


1

Mimo że jest trochę dziwny, działa jak określono (kursywa zaznaczona przeze mnie):

Możesz użyć symboli wieloznacznych (* lub?), Aby reprezentować jeden lub więcej   znaki nazwy pliku i wyświetlić podzbiór plików lub   podkatalogi.

Gwiazdka (*): użyj gwiazdki jako substytutu dowolnego ciągu   znaki, na przykład:

dir * .txt wyświetla wszystkie pliki w bieżącym katalogu z rozszerzeniami   że zaczynać się .txt, na przykład .txt, .txt1, .txt_old.

dir read * .txt wyświetla listę wszystkich plików w bieżącym katalogu, który się rozpoczyna   „czytaj” i z rozszerzeniami zaczynającymi się od .txt, takimi jak .txt, .txt1,   lub .txt_old.

dir read *. * wyświetla listę wszystkich plików w bieżącym katalogu, który się rozpoczyna   „czytaj” z dowolnym rozszerzeniem.

Gwiazdka symbol wieloznaczny zawsze używa krótkiego mapowania nazw plików, więc ty   może uzyskać nieoczekiwane wyniki .


Może warto dodać do tej odpowiedzi, że dir /x ... pokaże zarówno krótkie, jak i długie nazwy plików.
— DavidPostill

Jeśli chodzi o ostatnie zdanie, zastanawiam się, co się dzieje, gdy wyłącza się krótkie nazwy plików 8.3 w systemie plików? ( fsutil behavior set disable8dot3 1 )
— paradroid

Więc możesz mi powiedzieć gdzie cmd ma błąd wieloznaczny? istnieje rozwiązanie opisanego tutaj problemu? Jak możesz wymienić pliki * .cpp w katalogu?
— raphaelh

Pierwsza odpowiedź mówi: „Użyj dir / x, aby pokazać (i pracować z) krótkie wersje nazw plików”. Więc dir /x *.cpp powinien działać (nie testowany).
— agtoever

Z wyjątkiem tego, że nie chcę pokazywać ani pracować z krótkimi wersjami nazw plików, chcę tylko wyświetlić pliki * .cpp w katalogu ... λ dir /x "..\src\*.cpp" | find "/" 09/09/2015 17:52 51 605 main.cpp 09/09/2015 17:52 51 605 MAIN~1.CPP main.cpp_ 09/09/2015 17:52 51 605 MAIN~2.CPP main.cpp2
— raphaelh

1

Ponieważ rozszerzenie ma więcej niż 3 znaki i używasz interpetera poleceń, który ma wiele kodów kompatybilności wstecznej dla aplikacji 16-bitowych. Gdybyś uruchomił to samo polecenie w PowerShell, zachowywałby się zgodnie z oczekiwaniami.

Edytuj, ponieważ nie mogę odpowiadać na komentarze

Tak, po prostu uruchom powershell.exe, a następnie wydaj to samo polecenie, bez flagi / b.

Edytuj 2

O ile wiem, nie byłoby rozwiązania, chyba że chciałbyś napisać własne dir program. Jeśli chodzi o PowerShell, dobrym pomysłem byłoby zapoznanie się z nim, ponieważ jestem pewien, że Microsoft próbuje zabić starszego tłumacza DOS.


Dzięki! Czy istnieje rozwiązanie?
— raphaelh

Czy istnieje rozwiązanie bez używając PowerShell?
— raphaelh

Długie nazwy plików, znaki NTFS i legalne nazwy plików - „Włącz lub wyłącz nazwy plików 8.3 w NTFS ... [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] NtfsDisable8dot3NameCreation=1 „
— DavidPostill

-2

Znalazłem rozwiązanie bez użycia PowerShell:

λ dir /b "..\src\" | findstr /r /c:".*\.cpp$"

Dziwne. Przeczytałem twój oryginalny post jako pytanie, a nie jako problem. Dlatego dałem odpowiedź zamiast rozwiązania problemu ... Jeśli to działa dla ciebie, proszę przyjąć własną odpowiedź, więc to pytanie zostanie zamknięte.
— agtoever

Przepraszam, jeśli nie byłem wystarczająco jasny! Dowiedziałem się, że nie mogę zaakceptować mojej odpowiedzi do 2 dni.
— raphaelh
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.