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.