3

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

dir *.asp /s

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

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

5 ответов5

5
dir /x

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

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


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

fsutil behavior set disable8dot3

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


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

0

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

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

0

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

dir *.asp -r | remove-item

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

0

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

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

dir /s *.asp | find /i /v ".aspx "
0

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

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