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

3

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

dir *.asp /s

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

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

Крис
источник

Ответы:

5
dir /x

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

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


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

fsutil behavior set disable8dot3

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


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

grawity
источник
Ну, это довольно хорошее объяснение, почему - но кажется, что нет способа заставить команду dir игнорировать файлы aspx?
Крис
1
@ chris: Нет. Но вы можете либо удалить имена 8.3 из вашей системы (скорее всего, это избавит вас от многих проблем позже), либо отфильтровать dirвывод с помощью dir /b/s *.asp | findstr /ile .asp- это отбрасывает строки, которые не заканчиваются .asp.
Гравитация
в соответствии с этим ответом вы можете использовать fsutil 8dot3name strip directoryдля удаления существующих имен, нет необходимости переименовывать их
phuclv
0

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

JdeBP
источник
0

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

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

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

Если у вас есть PowerShell , вы можете использовать:

dir *.asp -r | remove-item

Если у вас нет PowerShell, почему бы и нет?

Питер Хандорф
источник
0

Как пользователь grawity уже сказал в своем ответе , это происходит потому , что специальные символы , используемые cmd«s внутренних команд и несколько внешних них также сопоставляют 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 все еще совпадают, хотя и маловероятно.

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

aschipfl
источник