Заданная маска имени файла k t d не соответствует указанному имени файла шаблона

Обновлено: 21.11.2024

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

12 ответов 12

Чтобы завершить существующие ответы:

Утилита списка каталогов по умолчанию ls может использоваться в сочетании с подстановочными знаками оболочки. Чтобы найти все файлы с шаблоном abc :

Обратите внимание, что расширение файла также относится к результатам поиска.

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

В этом случае само дерево поддерживает подстановочные знаки.

Почему, когда я выполняю команду ls -l B*, отображается содержимое всех каталогов, начинающихся с буквы B, а не только имена соответствующих каталогов?

@ErikE Потому что, когда вы просите ls указать каталог, он открывает его, это то же самое, что и ls -l BirthdayPhotos . Вы можете подавить это поведение с помощью ls -d B* .

@ErikE Поскольку использование файлового шаблона B* расширяется, чтобы соответствовать всем каталогам, начинающимся с B, поэтому вы действительно передаете ls список каталогов, поэтому он открывает их все для вас.

Не отвечает на вопрос. ls -d ABC* было тем, о чем спрашивал автор. Также комментарии во фрагменте кода неверны, ls abc* перечисляет содержимое каталогов, начинающихся с abc.

Вы можете использовать команду find для поиска файлов по шаблону

Приведенная выше команда будет искать файл, начинающийся с abc, в текущем рабочем каталоге.

-name 'abc' отобразит файлы, которые точно совпадают. Например: азбука

Вы также можете использовать

опция с командой find для поиска имени файла по шаблону

Есть много способов сделать это, в зависимости от того, что вы хотите с ними делать. Как правило, если вы хотите просто перечислить их, вы можете сделать это в терминале, используя:

<р>. и замените ABC своим текстом.

Чтобы понять команду, давайте немного разберем ее:

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

Первая черта | перенаправляет вывод одной команды на другую, в этом случае вывод find перенаправляется на grep . Это называется трубопроводом.

grep берет вывод и фильтрует его, используя заданный шаблон, ^\./ABC .

  • Обратите внимание, что шаблон заключен в одинарные кавычки ' ', чтобы оболочка не интерпретировала специальные символы внутри него.

Теперь сам шаблон записывается с использованием особого синтаксиса, называемого регулярным выражением, или, сокращенно, регулярным выражением. Regex — чрезвычайно мощный инструмент поиска, если вы освоите его, и есть сайты, подобные этому, которые учат вас более подробно, но обратите внимание, что grep не является полноценным механизмом регулярных выражений, и вы не можете делать с ним все.

Для нашей цели:

^ в регулярном выражении соответствует началу строки; это предотвращает сопоставление шаблона, если он не встречается в начале имени файла.

<р>. в регулярном выражении также имеет особое значение: оно означает «соответствовать любому отдельному символу здесь». Если вы хотите использовать его как буквальную точку, вам придется «экранировать» его, используя обратную косую черту \ перед ним. (Да, сопоставление любого символа в нашем случае было бы безвредно, но я сделал это для полноты картины.)

Вы хотите получить список файлов, соответствующих определенному шаблону.

Решение

Используйте командлет Get-ChildItem как для простой, так и для расширенной поддержки подстановочных знаков:

Чтобы найти в текущем каталоге все элементы, соответствующие подстановочному знаку PowerShell, укажите этот подстановочный знак в командлете Get-ChildItem:

Чтобы найти в текущем каталоге все элементы, соответствующие фильтру зависимого от поставщика, укажите этот фильтр в параметре -Filter:

Чтобы найти в текущем каталоге все элементы, не соответствующие подстановочному знаку PowerShell, укажите этот подстановочный знак в параметре -Exclude:

Чтобы найти все элементы в подкаталогах, соответствующие подстановочному знаку PowerShell, используйте параметры -Include и -Recurse или используйте подстановочный знак как часть параметра -Path:

Чтобы найти все элементы в подкаталогах, соответствующие фильтру зависимого от поставщика, используйте параметры -Filter и -Recurse:

Чтобы найти все элементы в подкаталогах, которые не соответствуют подстановочному знаку PowerShell, используйте параметры -Exclude и -Recurse:

Используйте командлет Where-Object для расширенной поддержки регулярных выражений:

Чтобы найти все элементы, имя файла которых соответствует регулярному выражению, используйте командлет Where-Object для сравнения свойства Name с регулярным выражением:

Чтобы найти все элементы с именем каталога, совпадающим с регулярным выражением, используйте командлет Where-Object для сравнения свойства DirectoryName с регулярным выражением:

Чтобы найти все элементы с именем каталога или именем файла, совпадающим с регулярным выражением, используйте командлет Where-Object для сравнения свойства FullName с регулярным выражением:

Обсуждение

Командлет Get-ChildItem поддерживает подстановочные знаки с помощью трех параметров:

Параметр -Path является первым параметром (и параметром по умолчанию). Хотя вы можете вводить простые пути, такие как . , C:\ или D:\Documents можно также указать пути, содержащие подстановочные знаки, например * , *.txt , [a-z]. log или даже C:\win*\*.N[a-f]?\F*\v2*\csc.exe .

Параметры -Include и -Exclude действуют как фильтр для использования подстановочных знаков в параметре -Path. Если указать параметр -Recurse, подстановочные знаки -Include и -Exclude применяются ко всем возвращаемым элементам.

Самая распространенная ошибка с параметром -Include возникает, когда вы используете его для пути без подстановочных знаков. Например, похоже, что это не дает ожидаемых результатов:

Эта команда не дает результатов, потому что вы не указали подстановочный знак для пути. Вместо этого правильная команда:

Параметр -Filter позволяет фильтровать результаты на основе зависимого от поставщика языка фильтрации поставщика, от которого вы получаете элементы. Поскольку поддержка подстановочных знаков в PowerShell очень похожа на подстановочные знаки файловой системы, и большинство людей используют параметр -Filter только для файловой системы, этот параметр кажется избыточным (и эквивалентным). Однако поставщик SQL будет использовать синтаксис SQL в параметре -Filter. Аналогичным образом поставщик Active Directory будет использовать пути LDAP в параметре -Filter.

Это может быть неочевидно, но язык фильтрации поставщика файловой системы не совсем совпадает с синтаксисом подстановочных знаков PowerShell. Например, параметр -Filter не поддерживает диапазоны символов:

Фильтрация, зависящая от поставщика, часто может возвращать результаты гораздо быстрее, чем более многофункциональные подстановочные знаки PowerShell. Из-за этого PowerShell внутренне переписывает ваши подстановочные знаки в комбинацию подстановочных знаков и фильтрации для конкретного поставщика, чтобы дать вам лучшее из обоих миров!

Для получения дополнительных сведений о синтаксисе подстановочных знаков PowerShell введите Get-Help about_WildCards .

Если вы хотите выполнить еще более сложную фильтрацию, чем та, которую предлагает синтаксис подстановочных знаков PowerShell, командлет Where-Object предоставляет безграничные возможности. Например, чтобы исключить определенные каталоги из поиска, используйте следующее:

Или, в более простой форме:

Для фильтра, который сложно (или невозможно) указать программно, используйте командлет Out-GridView, как показано в рецепте 2.4, для интерактивной фильтрации вывода.

Благодаря конвейерной модели PowerShell расширенный набор файлов, созданный командлетом Get-ChildItem, автоматически превращается в расширенный набор файлов, с которым могут работать другие командлеты:

Для получения дополнительных сведений о командлете Get-ChildItem введите Get-Help Get-ChildItem .

Для получения дополнительной информации о командлете Where-Object введите Get-Help Where-Object .

Во время поиска повторяющихся файлов имя каждого файла проверяется и сравнивается с настройками, заданными в разделе «Имена файлов» на закрепляемой панели «Фильтрация поиска».

Маски имен файлов могут быть как включающими, так и исключающими (подробности см. ниже).

Маски имен файлов могут быть определены с использованием одного из двух синтаксисов: шаблонов подстановочных знаков (по умолчанию) или более сложных регулярных выражений. Используйте переключатель "Использовать сопоставление с регулярным выражением" в разделе масок имен файлов на панели фильтрации поиска, чтобы переключаться между этими двумя режимами.

Шаблоны подстановочных знаков (включая и исключая)

При работе в режиме шаблона подстановочных знаков маски имен файлов состоят из шаблонов символов с несколькими наборами масок, разделенных точкой с запятой. Подстановочные знаки включают '?' и '*', которые соответствуют либо одному экземпляру, либо нескольким экземплярам любого символа (соответственно). Любой другой символ (не подстановочный знак) соответствует самому себе.

Кроме того, любой маске имени файла может предшествовать символ тильды ('~'), который указывает, что маска является исключающей. Если имя файла соответствует исключающей маске, файл всегда будет пропущен.

Вы также можете использовать переключатель "Сравнить полный путь", чтобы сравнить весь путь файловой системы (а не только имя файла) с заданным фильтром.

Примеры подстановочных знаков

Вот несколько примеров масок имен файлов с подстановочными знаками:

• mypicture.bmp — в этой маске нет подстановочных знаков, поэтому она соответствует буквальному. В процесс сравнения дубликатов будут включены только файлы с именем "mypicture.bmp".

• *.bmp — эта маска использует символ звездочки ('*') для включения любых файлов с расширением ".bmp" в именах.

• *.bmp;*gif;*jpg — это составная маска с отдельными элементами, разделенными точкой с запятой. Эта маска будет соответствовать любому ".bmp", ".jpg" или ".jpg", с которыми он сталкивается.

• ~family*;*.bmp — первому элементу этой составной маски предшествует тильда ('~'), что означает, что будут исключены все файлы, имена которых начинаются с "family". Затем он будет включать все файлы с расширением ".bmp" в своих именах.

В разделе имен файлов на панели закрепления «Фильтрация поиска» также есть кнопка «Предустановки», которую можно нажать для быстрого доступа к ряду встроенных масок (называемых «Группы файлов»). Они помогут вам быстро приступить к работе, а также могут быть настроены в соответствии с вашими потребностями.

Важное примечание. При использовании подстановочных знаков в масках имен файлов имейте в виду, что маска '*.*' немного отличается от простой '*'. Первый требует наличия точки (.) в имени файла, а второй — нет. Другими словами, шаблон *.* не будет соответствовать именам файлов без расширения. Если вы хотите сопоставить их, используйте вместо этого только одну звездочку (*).

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

Duplicate File Detective использует механизм регулярных выражений, совместимый с ECMAScript, и связанный с ним синтаксис.

В этом справочном файле не содержится подробного руководства по формированию регулярных выражений, поскольку в Интернете имеется большое количество таких руководств (зайдите в свою любимую поисковую систему и введите "регулярные выражения" или "регулярные выражения ECMAScript"). синтаксис выражения" в поле поиска, чтобы найти их).

Примеры регулярных выражений:

• .* — соответствует всему (например, любому имени файла).

• .*(back).* — соответствует любому имени файла, содержащему слово "back"

• ^(. *settings).* — соответствует любому имени файла, НЕ содержащему слова «settings».

• ^(. *settings)(.*wonder).* — соответствует любому имени файла, содержащему слово «wonder», но НЕ содержащему слово «settings».

• ^front.* — соответствует любому имени файла, начинающемуся со слова «front».

• .*\d.* — Соответствует именам файлов, содержащим четырехзначное число.

Исключение защищенных типов файлов

По умолчанию Duplicate File Detective исключает защищенные типы файлов из процесса поиска дубликатов. Для управления защищенными типами файлов перейдите на вкладку «Защита» в окне «Настройки».

Если вы найдете эту информацию полезной, рассмотрите возможность приобретения экземпляра моей книги Стандартная библиотека Python на примере.

Содержание страницы

Навигация

Эта страница

Примеры

Вывод всех примеров программ из PyMOTW был сгенерирован с помощью Python 2.7.8, если не указано иное. Некоторые из описанных здесь функций могут быть недоступны в более ранних версиях Python.

Если вы ищете примеры, которые работают в Python 3, обратитесь к разделу сайта PyMOTW-3.

Навигация

Цель:Использовать правила оболочки Unix для уточнения имен файлов, соответствующих шаблону.
Доступно в:1.4

Несмотря на то, что glob API очень прост, модуль обладает большой мощностью. Это полезно в любой ситуации, когда вашей программе необходимо найти список файлов в файловой системе с именами, соответствующими шаблону. Если вам нужен список имен файлов с определенным расширением, префиксом или любой общей строкой в ​​середине, используйте glob вместо написания кода для самостоятельного сканирования содержимого каталога.

Правила шаблона для glob не являются регулярными выражениями. Вместо этого они следуют стандартным правилам расширения пути Unix. Есть только несколько специальных символов: поддерживаются два разных подстановочных знака и диапазоны символов. Правила шаблонов применяются к сегментам имени файла (останавливаясь на разделителе пути, / ). Пути в шаблоне могут быть относительными или абсолютными. Имена переменных оболочки и тильда ( ~ ) не раскрываются.

Пример данных¶

В приведенных ниже примерах предполагается, что в текущем рабочем каталоге присутствуют следующие тестовые файлы:

Используйте glob_maketestdata.py в примере кода, чтобы создать эти файлы, если вы хотите запустить примеры.

Подстановочные знаки¶

Звездочка ( * ) соответствует нулю или более символов в сегменте имени. Например, dir/* .

Шаблон соответствует каждому имени пути (файлу или каталогу) в каталоге dir без рекурсии в подкаталоги.

Чтобы перечислить файлы в подкаталоге, вы должны включить подкаталог в шаблон:

В первом случае выше имя подкаталога указано явно, а во втором случае поиск каталога зависит от подстановочного знака.

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

Односимвольный подстановочный знак¶

Другой поддерживаемый подстановочный знак — вопросительный знак ( ? ). Он соответствует любому одиночному символу в этой позиции в имени. Например,

Соответствует всем именам файлов, которые начинаются с «file», содержат еще один символ любого типа и заканчиваются на «.txt».

Диапазоны символов¶

Если вам нужно сопоставить определенный символ, используйте диапазон символов вместо вопросительного знака. Например, чтобы найти все файлы, в имени которых перед расширением есть цифра:

Диапазон символов [0–9] соответствует любой отдельной цифре. Диапазон упорядочен на основе кода символа для каждой буквы/цифры, а тире указывает на непрерывный диапазон последовательных символов. То же значение диапазона может быть записано как [0123456789] .

glob Документация стандартной библиотеки для этого модуля. Обозначение сопоставления с образцом Объяснение подстановки из спецификации языка команд оболочки The Open Group. fnmatch Реализация сопоставления имен файлов. Доступ к файлам Другие инструменты для работы с файлами.

Навигация

© Авторские права Дуг Хеллманн. | | Последнее обновление: 11 июля 2020 г. | Создано с помощью Sphinx. | Дизайн на основе "Листьев" от SmallPark |

Мне нужно решить, соответствует ли имя файла маске файла. Маска файла может содержать * или ? персонажи. Есть ли какое-нибудь простое решение для этого?

13 ответов 13

Я ценю, что нашел ответ Джоэла, он также сэкономил мне время! Однако мне пришлось внести несколько изменений, чтобы метод работал так, как ожидало большинство пользователей:

  • Я удалил ключевое слово this перед первым аргументом. Здесь он ничего не делает (хотя может быть полезен, если метод предназначен для использования в качестве метода расширения, и в этом случае он должен быть общедоступным и содержаться в статическом классе, а сам должен быть статическим методом).
  • Я сделал регулярное выражение независимым от регистра, чтобы оно соответствовало стандартному поведению подстановочных знаков Windows (например, "c*.*" и "C*.*" возвращают один и тот же результат).
  • Я добавил начальную и конечную привязки к регулярному выражению, опять же, чтобы соответствовать стандартному поведению подстановочных знаков Windows (например, "stuff.txt" будет соответствовать "stuff*", "s*" или "s*.*", но а не просто "s").

Обновление 2009.11.04: соответствие одной из нескольких масок

Для еще большей гибкости здесь используется плагин-совместимый метод, созданный поверх оригинала. Эта версия позволяет передавать несколько масок (отсюда множественное число во втором имени параметра fileMasks), разделенных линиями, запятыми, вертикальными чертами или пробелами. Я хотел, чтобы пользователь мог поместить в ListBox столько вариантов, сколько пожелает, а затем выбрать все файлы, соответствующие любому из них. Обратите внимание, что некоторые элементы управления (например, ListBox) используют CR-LF для разрывов строк, в то время как другие (например, RichTextBox) используют только LF, поэтому и "\r\n", и "\n" отображаются в списке разделения.< /p>

Обновление 2009.11.17: более изящная обработка входных данных fileMask

Предыдущая версия FitsMask (которую я оставил для сравнения) неплохо справляется со своей задачей, но, поскольку мы рассматриваем ее как регулярное выражение, она выдает исключение, если при входе не является допустимым регулярным выражением. Решение состоит в том, что мы действительно хотим, чтобы любые метасимволы регулярных выражений во входном файлеMask считались литералами, а не метасимволами. Но нам все еще нужно специально обрабатывать точку, звездочку и вопросительный знак. Таким образом, эта улучшенная версия FitsMask безопасно убирает эти три символа, преобразует все оставшиеся метасимволы в литералы, а затем возвращает три интересных символа обратно в их "регулярно выраженную" форму.

Еще одно незначительное улучшение – возможность независимости от регистра в соответствии со стандартным поведением Windows.

Обновление 30.09.2010: где-то по пути возникла страсть.

Я небрежно не обновил это ранее, но эти ссылки, вероятно, будут интересны читателям, которые дошли до этого места:

Читайте также: