cmd.exe: «del * .txt» также удаляет * .txt1 и т. д. [дубликаты]


8

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

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

Ответы:


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


+1 за более авторитетную ссылку, чем моя.
Джим Дэвис

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окончаниями.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.