Po uruchomieniu dir *.*
generuje nieoczekiwane wyniki. Wyświetlane są nawet pliki i foldery bez kropki w nazwie. Na przykład
C:\>dir *.*
Volume in drive C is System
Volume Serial Number is AC0A-29DA
Directory of C:\
14-03-2017 05:17 PM 8,192 ntuser.dat
03-01-2017 07:10 PM <DIR> Perl520
28-03-2017 10:13 AM <DIR> Program Files
28-03-2017 10:13 AM <DIR> Program Files (x86)
04-01-2017 03:25 PM <JUNCTION> Python27 [C:\Program Files\Anaconda]
06-02-2017 10:16 PM <DIR> SAP
28-03-2017 04:10 PM 152 useragent.log
03-01-2017 03:04 PM <DIR> Users
16-03-2017 04:24 PM <DIR> VM
22-03-2017 11:13 AM <DIR> Windows
2 File(s) 8,344 bytes
8 Dir(s) 270,172,966,912 bytes free
Dlaczego? Czy jest jakiś sposób, aby wyświetlić tylko pliki z kropką?
.
takich, jakie mają.
na końcu, do wielu celów, w tym do tego..
znaku, mają.
na końcu znak domyślny . - Możesz mieć folder o nazwie „Blah.old”, na przykład, a wtedy miałby tradycyjne 3-literowe rozszerzenie pliku; codzienne użytkowanieBlah
jest jednak takie samo jak „Blah.
”, niezależnie od tego, czy jest to plik, czy folder..
, a etykiety w nazwach DNS są oddzielone.
(dlatego nazwa głównej strefy DNS jest pojedynczą etykietą o zerowej długości). Jedno dziecko podstawowej strefy DNS.
jestcom.
, a jedno dzieckocom.
jestsuperuser.com.
i tak dalej.Odpowiedzi:
Piszę tę odpowiedź, ponieważ OP podkreśliła, że:
DIR
Polecenie pochodzi z czasów, gdy:Dlatego przez ten standard
*.*
rozumie się bez względu na nazwę i rozszerzenie . To nie znaczy łańcuch zawierający „« które mogą lub nie mogą mieć znaki przed lub po».” .Zasady Microsoft zachowują zgodność wsteczną. Dlatego ta interpretacja
*.*
zostaje zachowana.Ale w Windows PowerShell
*.*
oznacza ciąg zawierający „.”, Który może, ale nie musi zawierać znaków przed lub po „.” .źródło
Folder.
” i folder o nazwie „Folder
” są nazywane tak samo, jeśli chodzi o system Windows.AA.BB
<8 w pierwszej części i <3 w rozszerzeniu? Czy to tylko pad ze spacjami?Dlaczego?
Odpowiedź na „ Dlaczego to jest? ” Można znaleźć w artykule Wildcards :
Implikacja . Ostatni {dot} w pliku / nazwy folderu oddziela nazwę bazową i rozszerzenie. Więc
dir *.
wyświetla wszystkie elementy bez rozszerzenia orazdir *.*
wyświetla wszystkie elementy z rozszerzeniem zera lub więcej znaków .Ściśle mówiąc,
dir *.
wyświetla wszystkie elementy bez kropki (.
) w nazwie . (BTW, nazwy plików, ścieżki i przestrzenie nazw Artykuł MSDN wyraźnie stwierdza, że „ dopuszczalne jest określenie kropki jako pierwszego znaku nazwy ”).Czy jest jakiś sposób, aby wyświetlić tylko pliki z kropką?
Nie wydaje mi się Istnieje jednak obejście z odpowiednim wyrażeniem regularnym.
PowerShell (pełne rozwiązanie, jeśli jest używane w konsoli PowerShell ):
Cmd (tylko pomysł, może wymagać dopracowania):
Dodatek: premia i wyjaśnienie
Intuicyjne zgadywanie, które
Name
jest połączoneBaseName
iExtension
nie ma zastosowania . Poniższy skrypt dowodzi, że używacmd
iPowerShell
podstawowych funkcji, a dziwny^..*\...*$
regex pochodzi z jego wyników.Wyjście :
Porównaj definicję
BaseName
właściwości, inną dla plików i folderów:Moja pierwotna odpowiedź była oparta na niewybaczalnym nieporozumieniu:
Przeczytajdir /?
, użyjdir /A:-D
:Inne podejście: zastosujfindstr
wyrażenie regularne jakodir *.* | findstr /V "<.*>"
źródło
*.*
pasuje do wszystkich plików , jak stwierdzono w pytaniu.
podobnego.dbus-keyrings
,.VirtualBox
i.vscode
.dir /A:-D
Wymienia więc tylko pliki, które są szczęśliwe?dir /A:-D
jest nieprawidłowe. 1 / wyświetla listę plików bez rozszerzenia. 2 / nie zawiera katalogów, które mają.
w swoim imieniu (całkowicie legalne)Możesz dopasować nazwy plików do kropki, używając nieudokumentowanej symboli wieloznacznej
<
, która pasuje albo do sekwencji 0 lub więcej znaków w nazwie basename, albo do sekwencji 0 lub więcej znaków w rozszerzeniu:Pamiętaj, że
<
jest to również metaznak, więc musisz cytować lub uciec z niego, ilekroć użyjesz go we wzorcu z powłoki poleceń.źródło
Interpreter wiersza poleceń będzie widział „ . ” Jako „Wszystkie podstawowe nazwy plików” z „wszystkimi rozszerzeniami”. Puste rozszerzenie jest nadal rozszerzeniem , więc zostanie dopasowane i zwrócone z listą. Jak wyjaśnili inni, jest to kac z wcześniejszych wersji systemu Windows i MS-DOS.
Jeśli chcesz wyglądać przy użyciu programu PowerShell, znalezienie tych plików jest znacznie łatwiejsze. Zauważ, że w PowerShell „dir” to alias polecenia cmdlet „Get-ChildItem”.
Aby znaleźć wszystkie pliki (nie katalogi / foldery), które mają rozszerzenie (np. „Myfile.txt”, ale nie „FileWithNoExt”):
przełącznik „-af” jest skrótem dla „-File”, który ogranicza obiekty zwrotne tylko do plików. „-ad” otrzyma tylko katalogi. „\”. oznacza „dosłowny znak kropki”. Bez ukośnika kropka pasowałaby do dowolnego znaku, zgodnie ze standardowym wyrażeniem regularnym.
Aby pobrać wszystkie pliki z kropką w nazwie bez rozszerzenia, a także z rozszerzeniem (np. „MyDocument_v1.1.doc”, ale nie „myfile.txt”):
Należy jednak pamiętać, że spowoduje to wykluczenie pliku o nazwie takiej jak „.archive” z poprzedzającą kropką. Wynika to z faktu, że jest traktowany jako nieposiadający nazwy basename i rozszerzenia „archiwum”. Jeśli chcesz dołączyć te:
Tutaj wzór dopasowania mówi „Dosłowna kropka, LUB (|) BeginningOfString (^), a następnie EndOfString ($) (tj. Pusty ciąg znaków)”. Ponieważ plik nie może mieć zarówno pustej nazwy basename, jak i rozszerzenia, znajdzie pliki zaczynające się od kropki.
źródło
ls *.*
wystarczy w PowerShell , jak wielu innych przed tobą odpowiedziałoJeśli wpiszesz powyższą komendę, to tutaj: * (jest to symbol wieloznaczny, co oznacza dowolną sekwencję znaków), po której następuje kropka (.), Po której następuje * to może być interpretowane jako pokaż wszystkie pliki o podobnej nazwie (dowolna sekwencja znaków ). (dowolna sekwencja znaków), co dodatkowo oznacza, że pokazują wszystkie pliki z dowolnym rozszerzeniem.
źródło
Program Files
się na liście? Nie pasuje do wzoru<sequence of characters>.<sequence of characters>
.