cmd.exe: "del *.txt" also removes *.txt1 etc [duplicate]

Possible Duplicate:
WinXP dir command: 3 and 4 char extensions are the same?

I have been annoyed by a strange behavior of cmd.exe for a long time (at least WinXP and Windows7). A command like del *.txt will also remove *.txt1 files (any number of characters after '.txt' will do). Is this a well known bug or what?


It's an occasionally-encountered somewhat-known?

An explanation of the behavior is here, complete with a possible work-around.

Summary: It comes from the way NTFS handles short (8.3) filenames, for compatibility with older stuff that can't handle "new-fangled" long filenames. dir /x can be used to view the short filename, like so:

C:\>dir /x *~*
 ...
02/25/2011  08:18 AM    <DIR>          DOCUME~1     Documents and Settings
05/28/2011  12:02 AM    <DIR>          PROGRA~1     Program Files
 ...

Extensions longer than three characters will simply be truncated for their short filename; so .txt1, .txtxtxtxt, .txt_file, etc, all become .txt.


Files with more than 4 letters in the extension (and other rules of course also apply), get a short name, so for example "foo.txt1" has the shortname "foo~1.txt". DEL (like DIR and possibly most other cmd.exe builtin commands) will also operate on shortnames. For a discussion on a related topic see here: http://blogs.msdn.com/b/oldnewthing/archive/2005/07/20/440918.aspx


Would this be on a FAT/VFAT filesystem? If so, you're getting bitten by the hackery used to represent names that don't fit into the 8.3 schema; there's a DIR option that shows you the mangled short names, which will begin with the actual file name but have a ~ and a number before the extension, then the extension is capped at 3 characters. (Example: C:\Program Files usually translates to C:\PROGRA~1.) A wildcard may unexpectedly match these names. This should not happen on NTFS or (I think) on network shares. except that DOS still hasn't died, it seems....


You can probably use Forfiles command for a workaround

Eg.

Forfiles  -s -m *.txt -c "cmd /C del /q @path"

Matches only txt endings.