Warum gibt mir dir *. * Alle Dateien und Ordner?

9125
phuclv

Wenn ich laufe dir *.*, führt das zu unerwarteten Ergebnissen. Sogar Dateien und Ordner ohne Punkt im Namen werden aufgelistet. Zum Beispiel

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 

Warum das? Gibt es eine Möglichkeit, nur Dateien mit einem Punkt aufzulisten?

60
Der Punkt ist immer da, er wird nur gedruckt, wenn ihm etwas folgt. Mit anderen Worten, Sie denken vielleicht, dass eine Datei "dies ist meine Datei" heißt, aber heimlich ist der Name "dies ist meine Datei". mit nichts nach dem Punkt. Analog könnte man denken, dass der DNS-Name für diese Site "superuser.com" ist, aber eigentlich "superuser.com". mit nichts nach dem zweiten Punkt. Todd Wilcox vor 7 Jahren 17
@ToddWilcox ist nur in DOS korrekt. Moderne Dateisysteme in Windows haben keinen eigenen Erweiterungsnamespace mehr phuclv vor 7 Jahren 11
@ LưuVĩnhPhúc Das Win32-Subsystem behandelt Dateinamen, die kein "." Enthalten, als ein "." Am Ende. Dies gilt für viele Zwecke, einschließlich dieses. CodesInChaos vor 7 Jahren 12
Ordner, die das Zeichen "." Nicht enthalten, haben am Ende ein impliziertes Zeichen ".". - Sie können beispielsweise einen Ordner mit dem Namen "Blah.old" haben, der dann eine herkömmliche Dateiendung mit 3 Buchstaben hätte. Für den täglichen Gebrauch ist "Blah" jedoch dasselbe wie "Blah", unabhängig davon, ob es sich um eine Datei oder einen Ordner handelt. BrainSlugs83 vor 7 Jahren 2
@ToddWilcox Ähm, ich denke, das vermischt wirklich ein paar Dinge. Soweit ich weiß, ist das bisschen über die DNS-Suche auch falsch. Ich denke, die meisten von ihnen führen eine einfache regelbasierte Umleitung durch, wenn Sie nach einem solchen Hostnamen fragen. can-ned_food vor 7 Jahren 0
@ can-ned_food Todd Wilcox ist in Bezug auf DNS richtig. Die Root-DNS-Zone wird wörtlich als "." Bezeichnet, und Beschriftungen in DNS-Namen werden durch "." Getrennt (daher ist der Name der Root-DNS-Zone eine einzige Beschriftung mit der Länge Null). Ein Kind der Root-DNS-Zone `.` ist` com.` und ein Kind von `com.` ist` superuser.com.` usw. a CVn vor 7 Jahren 8
Beachten Sie, dass in Windows für die Analyse von Platzhaltern der Befehl verantwortlich ist, nicht der Befehl * Prompt *. Daher unterscheiden sich die Erweiterungsregeln für ein Befehlszeilentool möglicherweise von denen eines anderen Befehlszeilenprogramms. Dies ist ein Unterschied zu - sagen wir - Linux, wo normalerweise die * Shell * verantwortlich ist (vorbehaltlich Anführungszeichen). Allerdings haben die eingebauten Befehle der Eingabeaufforderung (einschließlich "dir", "copy", "del" usw.) die gleichen Erweiterungsregeln (da sie alle in demselben Programm implementiert sind - der Eingabeaufforderung). jimbobmcgee vor 7 Jahren 0
Interessanterweise wird in mindestens einer Version von MS-DOS (MS-DOS 7.1, die in Windows 95 OEM Service Release 2 oder höher und in allen Versionen von Windows 98 enthalten ist) und in allen Versionen von Windows 98 der Befehl `dir.exe` (zum Beispiel) analysiert `dir * .exe`; Dieses Verhalten scheint in der Windows NT-Eingabeaufforderung nicht vorhanden zu sein, soweit ich das beurteilen kann. Justin Time vor 7 Jahren 0
@jimbobmcgee Die Windows-API verarbeitet die Platzhaltererweiterung mit ihrer `FindFirstFile`-Funktionsfamilie (und ihrer Wrapperfamilie` _findfirst` in der C-Laufzeitbibliothek), sodass jedes Programm, das sie verwendet, die gleiche Platzhaltererweiterung hat. Medinoc vor 7 Jahren 1
Diese Informationen sind hilfreich, wenn Sie versuchen, [.htaccess von notepad.exe zu speichern] (http://stackoverflow.com/questions/5004633/how-to-manually-create-a-file-with-a-dot-prefix- in-windows-for-example-htacce) unter Windows. _Oder eine andere Punktdatei_ TecBrat vor 7 Jahren 0

5 Antworten auf die Frage

114
jpaugh

Ich schreibe diese Antwort, weil OP das betont hat:

Was mich interessiert, ist, warum *.*alle Dateien übereinstimmen, wie in der Frage angegeben

Der DIRBefehl stammt aus einer Zeit, in der:

  1. Punkt (.) War als Zeichen in Datei- oder Ordnernamen nicht zulässig
  2. Datei- und Ordnernamen waren auf 8 Zeichen für Namen und 3 Zeichen für Erweiterungen beschränkt

Mit diesem Standard *.*bedeutete es daher, welchen Namen und welche Erweiterung auch immer . Es bedeutet nicht, dass eine Zeichenfolge ein "." Enthält, das vor oder nach dem "." Zeichen enthalten darf oder nicht. .

Die Microsoft-Richtlinie behält die Abwärtskompatibilität bei. Daher wird diese Interpretation von *.*beibehalten.

In Windows PowerShell *.*bedeutet dies jedoch eine Zeichenfolge, die ein "." Enthält, das vor oder nach dem "." Zeichen enthalten darf oder nicht. .

Zusätzliche Lektüre: https://blogs.msdn.microsoft.com/oldnewthing/20071217-00/?p=24143 grawity vor 7 Jahren 9
Das ursprüngliche Dateisystem hat nicht einmal die Periode selbst auf der Festplatte gespeichert, sondern nur die 11 Zeichen, aus denen der Name besteht. Mr Lister vor 7 Jahren 24
Es ist erwähnenswert, dass Dateien und Ordner ohne Erweiterungen immer noch als leere Erweiterung ** behandelt werden. Daher haben ein Ordner mit dem Namen "` Folder.` "und ein Ordner mit dem Namen" `Folder`" denselben Namen, wenn es um Fenster geht. BrainSlugs83 vor 7 Jahren 7
@ BrainSlugs83 Nun, es hängt davon ab, welcher Teil von Windows. Ich hatte einen bösen Fehler, bei dem ich eine Datei aus IE11 mit einem `.` am Ende ihres Namens gespeichert habe. Ich habe keine Ahnung, was die Sysadmins getan haben, um das Problem zu beheben, aber jede Aktion in der Datei `file.` von Windows Explorer wurde stattdessen mit` file` versucht, sodass ich nicht den gesamten Verzeichnisbaum löschen kann. Sie haben wahrscheinlich Powershell verwendet, weil (wie in dieser Antwort gezeigt wird) dies nicht die Einschränkung der Namenskompatibilität hat, die viele von Windows haben. wizzwizz4 vor 7 Jahren 0
@ MrLister Interessant. Wie hat der alte FS Dateinamen wie `AA.BB` mit <8 im ersten Teil und <3 in der Erweiterung gespeichert? Hat es nur Leerzeichen aufgefüllt? Kelvin vor 7 Jahren 2
@Kelvin Ja, die beiden Teile waren getrennt gepolstert. plugwash vor 7 Jahren 3
@ Kelvin Ja. Wie AA␣␣␣␣␣␣BB␣ Mr Lister vor 7 Jahren 0
@Kelvin Wenn Sie an allen (alten) blutigen Details interessiert sind, lesen Sie bitte [Seiten 6/7 dieses PDF] (http://www.eit.lth.se/fileadmin/eit/courses/eitn50/Projekt1/FAT12Description) .pdf) TripeHound vor 7 Jahren 0
@ BrainSlugs83 Nicht so. https://i.imgur.com/710MUG7.png DavidPostill vor 7 Jahren 2
@DavidPostill Aber siehe: http://imgur.com/UgmX8xi Sie sind für einige Zwecke gleich und für andere nicht gleich. Ross Presser vor 7 Jahren 2
All dies wurde ursprünglich getan, um CP / M zu emulieren, das genau dasselbe tat. Dies wurde dann in MS-DOS 2 überarbeitet, um dem, was wir heute wissen, etwas näher zu kommen. Dies ist auch der Grund dafür, dass \ anstelle von / wie in Unix verwendet wird, weil / bereits in CP / M verwendet wurde, um Befehlszeilenoptionen anzugeben. Thorbjørn Ravn Andersen vor 7 Jahren 0
11
JosefZ

Warum das?

Eine Antwort auf " Warum ist das? " Konnte in Wildcards Artikel gefunden werden:

The * wildcard will match any sequence of characters (0 or more, including NULL characters)  The ? wildcard will match a single character (or a NULL at the end of a filename) 

Wildcard-Übereinstimmungsregeln

  • *Entspricht im Allgemeinen allen 0 oder mehr Zeichen mit einer Ausnahme (siehe nächste Regel). Der nicht-gierige Platzhalter kann beliebig viele oder so wenige Zeichen enthalten, wie es für den Rest der Maske erforderlich ist.

  • *.Am Ende der Maske entsprechen alle 0 oder mehr Zeichen außer . Tatsächlich gilt die Regel mit einer beliebigen Anzahl von und zwischen dem * und dem Terminal . Der reguläre Ausdruck für diesen Begriff lautet"[*][. ]*[.]$"

  • ?Entspricht 0 oder einem Zeichen außer . Das einzige Mal, wenn 0 Zeichen gefunden werden, ist das Ende des Namens oder die Position vor einem . Das Fragezeichen kann auch mehrmals verwendet werden, um mehr als ein Zeichen zu finden.

Implikation . Der letzte in einem Datei- / Ordnernamen trennt den Basisnamen und die Erweiterung. So

  • dir *.Zeigt alle Elemente ohne Erweiterung an und
  • dir *.*Zeigt alle Elemente mit der Erweiterung von null oder mehr Zeichen an .

Streng genommen dir *.werden alle Elemente ohne Punkt ( .) im Namen angezeigt . (Übrigens: Benennen von Dateien, Pfaden und Namespaces MSDN-Artikel besagt ausdrücklich, dass " es zulässig ist, einen Punkt als erstes Zeichen eines Namens anzugeben ").

Gibt es eine Möglichkeit, nur Dateien mit einem Punkt aufzulisten?

Ich glaube nicht Es gibt jedoch eine Problemumgehung mit einem passenden regulären Ausdruck.

PowerShell (Full-Scope-Lösung bei Verwendung in einer Powershell-Konsole):

:: PowerShell - no extension, full syntax PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}" :: PowerShell - extension, alias syntax PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}" 

Cmd (nur für eine Idee, kann etwas weiterentwickelt werden):

:: CMD/batch - no extension for /F "delims=" %%G in ('dir /OGN /B ^| findstr "^.[^\.]*$"') do @echo %%~tG %%~aG %%~zG %%~nxG :: CMD/batch - extension for /F "delims=" %%G in ('dir /OGN /B ^| findstr "^..*\...*$"') do @echo %%~tG %%~aG %%~zG %%~nxG 

Nachtrag: ein Bonus und eine Erklärung

Eine intuitive Vermutung, Namedie verkettet ist BaseNameund Extension nicht gilt . Das folgende Skript beweist es mit cmdund PowerShellKernfunktionen und die seltsame ^..*\...*$ regex aus seinen Ergebnissen abgeleitet.

@ECHO OFF SETLOCAL EnableExtensions DisableDelayedExpansion set "_workingDirectory=%~1" if "%_workingDirectory%"=="%tmp%\tests_SU_1193102" ( >NUL 2>&1 ( mkdir "%_workingDirectory%" pushd "%_workingDirectory%" rem make directories mkdir .Fldr-Ext mkdir aFldr-Ext mkdir .Fldr.Ext mkdir aFldr.Ext rem create files copy NUL .File-Ext  copy NUL aFile-Ext  copy NUL .File.Ext  copy NUL aFile.Ext popd ) ) else if "%_workingDirectory%"=="" set "_workingDirectory=%CD%" pushd "%_workingDirectory%" set "_first=ItemName Attributes BaseName Extension" echo ON :: dir /OGN | findstr "Ext$" for /F "delims=" %%G in ('dir /OGN /B') do @((if defined _first (echo %_first%&echo(&set "_first="))&echo %%~nxG %%~aG %%~nG %%~xG) :: Get-ChildItem | Select-Object -Property Mode, BaseName, Extension, Name PowerShell -c "dir | select -pr Name, Mode, BaseName, Extension | sort -pr @, @" 

Ausgabe :

==> D:\bat\BaseName_vs_Extension.bat "%tmp%\tests_SU_1193102"  ==> for /F "delims=" %G in ('dir /OGN /B') do @((if defined _first (echo ItemName Attributes BaseName Extension & echo( & set "_first=" ) ) & echo %~nxG %~aG %~nG %~xG ) ItemName Attributes BaseName Extension  .Fldr.Ext d---------- .Fldr .Ext .Fldr-Ext d---------- .Fldr-Ext aFldr.Ext d---------- aFldr .Ext aFldr-Ext d---------- aFldr-Ext .File.Ext --a-------- .File .Ext .File-Ext --a-------- .File-Ext aFile.Ext --a-------- aFile .Ext aFile-Ext --a-------- aFile-Ext  ==> PowerShell -c "dir | select -pr Name, Mode, BaseName, Extension | sort -pr @, @"  Name Mode BaseName Extension ---- ---- -------- --------- .Fldr.Ext d----- .Fldr.Ext .Ext .Fldr-Ext d----- .Fldr-Ext .Fldr-Ext aFldr.Ext d----- aFldr.Ext .Ext aFldr-Ext d----- aFldr-Ext .File.Ext -a---- .File .Ext .File-Ext -a---- .File-Ext aFile.Ext -a---- aFile .Ext aFile-Ext -a---- aFile-Ext 

Vergleichen Sie die Definition der BaseNameEigenschaft, anders für Dateien und Ordner:

PS D:\PShell> Get-ChildItem | Get-Member -Name BaseName | Format-List -property TypeName, Definition   TypeName : System.IO.DirectoryInfo Definition : System.Object BaseName   TypeName : System.IO.FileInfo Definition : System.Object BaseName else{$this.Name};} 

Meine ursprüngliche Antwort basierte auf einem unverzeihlichen Missverständnis:

Lesen dir /?, verwenden dir /A:-D:

/A Displays files with specified attributes. attributes D Directories R Read-only files H Hidden files A Files ready for archiving S System files I Not content indexed files L Reparse Points - Prefix meaning not 

Ein anderer Ansatz: findstrRegex anwenden alsdir *.* | findstr /V "<.*>"

Was mich interessiert, ist * warum `*. *` auf alle Dateien * zutrifft, wie in der Frage angegeben phuclv vor 7 Jahren 0
Ich fürchte, Ihr alternativer Vorschlag (findstr) findet keine Ordner, die mit einem `.` wie` .dbus-keyrings`, `.VirtualBox` und` .vscode` beginnen. vor 7 Jahren 0
`Dir / A: -D` listet also nur Dateien auf, die glücklich sind? Quentin vor 7 Jahren 21
"Gibt es eine Möglichkeit, nur Dateien mit einem Punkt aufzulisten?" `dir / A: -D` ist falsch. 1 / es listet Dateien ohne Erweiterung auf. 2 / es listet keine Verzeichnisse auf, die ein `.` im Namen haben (absolut legal) DavidPostill vor 7 Jahren 4
@ LưuVĩnhPhúc Abgesehen von den falschen Stellen dieser Frage, beantwortet sie in erster Linie den funktionalen Teil Ihrer Frage - das "Gibt es einen Weg" - was ich erwarten würde, wäre Ihre Hauptsorge. Das „Warum“ in Ihrem Titel erscheint fast überflüssig. can-ned_food vor 7 Jahren 0
@ can-ned_food ist eine Kleinigkeit, die ich als Folge des Befehlsergebnisses wissen möchte. Was ich frage, ist der fette Text oben auf dieser Seite phuclv vor 7 Jahren 0
`dir * .` zeigt alle Dateien und Ordner ohne Erweiterung an, nicht nur Ordner. `dir *. *` listet auch Dateien und Ordner auf phuclv vor 7 Jahren 0
omg ... es ist Jahrzehnte her, seit ich das letzte Mal "@echo off" gesehen habe rupps vor 7 Jahren 3
6
feersum

Gibt es eine Möglichkeit, nur Dateien mit einem Punkt aufzulisten?

Sie können Dateinamen mit einem Punkt abgleichen <, indem Sie den undokumentierten Platzhalter verwenden, der entweder einer Folge von 0 oder mehr Zeichen im Basisnamen oder einer Folge von 0 oder mehr Zeichen in der Erweiterung entspricht:

dir "<.<" 

Denken <Sie daran, dass es sich auch um ein Metazeichen handelt. Sie müssen es daher bei jeder Verwendung eines Musters in der Befehls-Shell in Anführungszeichen setzen.

Ausgezeichnet. Dieser [undokumentierte Platzhalter] (https://ss64.com/nt/syntax-wildcards.html) ist in der Tat vorhanden phuclv vor 7 Jahren 0
1
Dave_J

Der Befehlszeileninterpreter sieht " . " Als "Alle Basisdateinamen" mit "Alle Erweiterungen". Eine leere Erweiterung ist immer noch eine Erweiterung, daher wird sie mit der Liste abgeglichen und zurückgegeben. Wie bereits erläutert, handelt es sich hierbei um einen Hangover früherer Versionen von Windows und MS-DOS.

Wenn Sie mit PowerShell zufrieden sind, ist das Auffinden dieser Dateien viel einfacher. Beachten Sie, dass in PowerShell "dir" ein Alias ​​für das Cmdlet "Get-ChildItem" ist.

So finden Sie alle Dateien (keine Verzeichnisse / Ordner), die eine Erweiterung haben (z. B. "myfile.txt", aber nicht "FileWithNoExt"):

dir -af | Where {$_.Name -match "\."} 

Die Option "-af" ist eine Abkürzung für "-File", wodurch die zurückgegebenen Objekte nur auf Dateien beschränkt werden. "-ad" würde nur Verzeichnisse erhalten. Das "\." bedeutet "ein literales Punktzeichen". Ohne den umgekehrten Schrägstrich würde der Punkt gemäß normalem regulären Ausdruck mit jedem Zeichen übereinstimmen.

Um alle Dateien zu erhalten, bei denen der Name ohne die Erweiterung einen Punkt enthält, sowie eine Erweiterung (z. B. "myDocument_v1.1.doc", aber nicht "myfile.txt"):

dir -af | Where {$_.BaseName -match "\."} 

Beachten Sie jedoch, dass dadurch eine Datei mit dem Namen ".archive" mit einem vorangestellten Punkt ausgeschlossen wird. Dies liegt daran, dass es so behandelt wird, als hätte es keinen Basisnamen und keine Erweiterung für "Archiv". Wenn Sie diese einschließen möchten:

dir -af | Where {$_.BaseName -match "\.|^$"} 

Hier sagt das Übereinstimmungsmuster "Ein literaler Punkt ODER (|) BeginningOfString (^) gefolgt von EndOfString ($) (dh eine leere Zeichenfolge)". Da eine Datei nicht sowohl einen Basisnamen als auch eine Erweiterung haben kann, werden die Dateien mit einem Punkt beginnend gesucht.

In PowerShell genügt "ls *. *", da viele andere bereits vor Ihnen geantwortet haben phuclv vor 6 Jahren 0
-2
Rahul Kant

Wenn Sie oben den Befehl eingeben, dann hier: * (Dies ist ein Platzhalter, der eine beliebige Zeichenfolge bedeutet), gefolgt von einem Punkt (.) Gefolgt von *. Dies könnte als Anzeige aller Dateien mit ähnlichem Namen (beliebige Zeichenfolge) interpretiert werden ) (beliebige Zeichenfolge), was weiterhin bedeutet, dass alle Dateien mit einer beliebigen Erweiterung angezeigt werden.

Warum werden dann "Programmdateien" in die Liste aufgenommen? Es stimmt nicht mit dem Muster überein.`. gronostaj vor 7 Jahren 1
Betrachten Sie es mehr als Aus diesem Grund würde es auch eine Datei mit dem Namen ".info" aufnehmen, in der der Basisname leer ist. Dave_J vor 7 Jahren 0