8

Возможный дубликат:
Команда WinXP dir: расширения для 3 и 4 символов одинаковы?

Меня долго раздражало странное поведение cmd.exe (по крайней мере, WinXP и Windows7). Такая команда, как del *.txt , также удалит файлы *.txt1 (любое количество символов после '.txt' будет выполняться). Это хорошо известная ошибка или как?

4 ответа4

8

Это случайно встречается несколько известный?

Объяснение поведения здесь, в комплекте с возможным обходным путем.

Описание: Это происходит от способа, которым NTFS обрабатывает короткие (8.3) имена файлов, для совместимости со старыми файлами, которые не могут обрабатывать «новомодные» длинные имена файлов. Для просмотра короткого имени файла можно использовать dir /x , например:

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
 ...

Расширения длиннее трех символов будут просто обрезаны для их короткого имени файла; поэтому .txt1 , .txtxtxtxt , .txt_file и т. д. все становятся .txt .

6

Файлы с более чем 4 буквами в расширении (и другие правила, конечно, также применяются), получают короткое имя, поэтому, например, «foo.txt1» имеет короткое имя «foo ~ 1.txt». DEL (например, DIR и, возможно, большинство других встроенных команд cmd.exe ) также будет работать с короткими именами. Для обсуждения связанной темы смотрите здесь: http://blogs.msdn.com/b/oldnewthing/archive/2005/07/20/440918.aspx

2

Будет ли это в файловой системе FAT/VFAT? Если это так, вас укусила хакерская атака, используемая для представления имен, которые не вписываются в схему 8.3; есть опция DIR которая показывает искаженные короткие имена, которые начинаются с фактического имени файла, но имеют расширение ~ и число перед расширением, затем расширение ограничивается 3 символами. (Пример: C:\Program Files обычно переводится в C:\PROGRA~1 ) Подстановочный знак может неожиданно совпадать с этими именами. Это не должно происходить на NTFS или (я думаю) на сетевых ресурсах. кроме того, что DOS все еще не умер, кажется ....

2

Вы можете, вероятно, использовать команду Forfiles для обхода

Например.

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

Совпадает только с окончаниями txt .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .