Команда WinXP dir: расширения для 3 и 4 символов одинаковы?

931
chris

Я пытаюсь рекурсивно искать дерево каталогов, чтобы найти все .aspфайлы, используя следующую команду:

dir *.asp /s 

По некоторым причинам это возвращает не только файлы asp, но также и файлы aspx.

Как я могу заставить его игнорировать файлы aspx?

3

5 ответов на вопрос

5
grawity
dir /x 

Из соображений совместимости Windows генерирует имя 8.3 для каждого созданного длинного имени файла, а код сопоставления с подстановочными знаками ( FindFirstFile()) проверяет как исходные, так и сокращенные имена. Используйте, dir /xчтобы увидеть, какие короткие имена присваиваются каждому файлу.

Часть «расширение» из 8.3 названия всегда создаются просто усечение последнего расширения не более чем 3 -х символов: .aspxв.ASP


При использовании файловой системы NTFS создание имени 8.3 можно отключить в масштабе всей системы, используя:

fsutil behavior set disable8dot3 

Однако это не повлияет на существующие имена. Вам нужно будет переименовать каждый файл, а затем переименовать его обратно в исходное имя.


Смотрите также: Поиск по каталогу в командной строке Windows показывает неверный вывод!

Ну, это довольно хорошее объяснение, почему - но кажется, что нет способа заставить команду dir игнорировать файлы aspx? chris 13 лет назад 0
@chris: Нет. Но вы можете _remove_ 8.3 имена из вашей системы (вероятно, сэкономит вам много проблем позже), или отфильтровать вывод `dir` с помощью` dir / b / s * .asp | findstr / ile .asp` - удаляет строки, которые не заканчиваются на `.asp`. grawity 13 лет назад 1
в соответствии с [этим ответом] (https://superuser.com/a/370306/241386) вы можете использовать `fsutil 8dot3name strip directory` для удаления существующих имен, не нужно их переименовывать phuclv 7 лет назад 0
[Почему FindFirstFile находит короткие имена?] (Https://blogs.msdn.microsoft.com/oldnewthing/20050720-16/?p=34883) phuclv 7 лет назад 0
0
Multiverse IT

Интересно - похоже, ошибка ...

Учитывая, я бы нашел это так:

dir /s *.asp | find /i /v ".aspx " 
это не ошибка, согласно ответу grawity. Но почему вы оставляете пробел в конце aspx? phuclv 7 лет назад 0
@phuclv, завершающий _space_ должен быть удален, потому что в противном случае он стал частью строки поиска; в любом случае, этот подход также исключает файлы с `.aspx` где-то посередине их имен, например` file.aspx.name.asp`, которые на самом деле должны быть включены ... aschipfl 5 лет назад 1
0
JdeBP

Конечно, это зависит от того, какую команду интерпретатора DIRкоманд вы используете. DIRКоманда в Take Command, например, соответствует только длинные имена по умолчанию и поэтому не проявляет такого поведения. ( Соответствие как коротких, так и длинных имен может быть включено для совместимости с DIRкомандой CMD .) Таким образом, существуют способы решения этой проблемы, которые не требуют FSUTILпривилегий администратора.

0
Peter Hahndorf

If you have PowerShell, you can use:

dir *.asp -r | remove-item 

If you don't have PowerShell, why not?

0
aschipfl

Как уже было сказано в ответе пользователя, это связано с тем, что подстановочные знаки, используемые cmdвнутренними и несколькими внешними командами, также совпадают с именами файлов 8.3, которые включены по умолчанию.

Чтобы обойти это, есть несколько способов, некоторые из которых я хочу показать вам:


Вы можете использовать findstrдля фильтрации имен файлов, возвращаемых dir:

dir /S /B /A:-D "*.asp" | findstr /IEC:".asp" 

Это даже не соответствует файлам, которые имеют .aspгде-то в своих именах (например file.asp.aspx), и не исключает файлы, которые имеют .aspxв своих именах (например file.aspx.asp).

Переключатель /Bпозволяет dirвозвращать чистый список имен файлов / путей, которые можно правильно отфильтровать. Опция /A:-Dисключает любые соответствующие каталоги.


В качестве альтернативы можно использовать whereкоманду, которая обрабатывает символы подстановки иначе, чем dir:

where /R "." "*.asp" 

Недостатком является то, что эта команда также относится к содержимому PATHEXTпеременной, поэтому она также будет соответствовать файлу, который заканчивается .asp.exe, учитывая, что .EXEон содержится в PATHEXT; чтобы избежать этого, вы можете временно очистить PATHEXTпеременную (по set "PATHEXT_BACKUP=%PATHEXT%" & set "PATHEXT=") и восстановить ее позже (по set "PATHEXT=%PATHEXT_BACKUP%" & set "PATHEXT_BACKUP=").


Этот ответ пользователя Konrad показывает способ изменить поведение по умолчанию при создании имен файлов 8.3 для элементов с расширением более 3 символов, что, в свою очередь, предотвращает большинство таких непреднамеренных совпадений. Но, к сожалению, это не меняет текущие имена файлов 8.3. И, конечно, теоретически могут быть ситуации, когда имена файлов 8.3 все еще совпадают, хотя и маловероятно.

Я должен признать, что я еще не проверял это ...

Похожие вопросы