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?

raphaelh
źródło
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 .

agtoever
źródło
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.

Matt
źródło
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$"
raphaelh
źródło
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