On Windows 7, I have a directory containing the following four files:
- xxx.txt
- xxx.txt2
- xxx2.txt
- xxx2.txt2
With the file have more than 3 character as a file extension, the behavior of the wildcard * seems odd:
dir *.txt
10/13/2014 04:14 PM 6 xxx.txt
10/13/2014 04:17 PM 6 xxx2.txt
10/13/2014 04:17 PM 6 xxx2.txt2
10/13/2014 04:14 PM 6 xxx.txt2
4 File(s) 24 bytes
0 Dir(s) 6,660,980,736 bytes free
I would expect to see only the two files with txt extension and not the ones with txt2 (like it would on a Linux machine). Does MS-DOS ignore the truncate the file extension to 3 characters or does it add automatically another wildcard at the end? If I want to delete only the files with txt extension and not the one with txt2, which command should I use?
Thanks
Best Answer
You're not using MS-DOS; it did not even allow file extensions longer than 3 characters. You're using the Windows command line – the
cmd.exe
shell, specifically.But Windows indeed tries hard to remain compatible with programs from that era. So, up until Windows 8 (or something like that), all files with longer extensions have an alias that has the extension truncated, along with the name itself.
If you run
dir /x
, you'll likely see that each file has a "short name" assigned to it, which is limited to 8+3 characters, just like in MS-DOS and 16-bit Windows.These names are there in case the user wanted to, let's say, upgrade to Windows 95 and still access their files through programs originally written for Windows 3.1 – so running a 16-bit program wouldn't crash, but would merely show
C:\PROGRA~1
andC:\MYDOCU~1\CALENDAR.TXT
in place ofC:\Program Files
andC:\My Documents\Calendar.txt
.(And yes, some people did actually use old 16-bit software even in Windows XP/Vista days... I'm pretty sure Windows 8 turn off the "short names" by default, however. This might be why @EBGreen isn't seeing the same 'problem'...)
Another thing to consider is that the old Windows shell,
cmd.exe
, has grown quite a few quirks and compatibility fixes in itself. For example, due to the way MS-DOS matched filenames,dir .txt
meant the same asdir *.txt
, even though it wasn't intentional. But people got used to the shorter syntax, and even though the Windows operating system itself doesn't treat.txt
as a wildcard anymore,cmd.exe
still accepts that syntax. (Thedir
command isn't a program on its own, but built into the shell.)(Similarly, in the linked article, another wildcard quirk is described – Windows filenames can have no extension at all, but people are really used to typing
*.*
, therefore it means the same thing as*
and the lone dot is ignored.)