Определить, какое из заданных имен файлов соответствует маске el t xt

Обновлено: 04.07.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 не является полноценным механизмом регулярных выражений, и вы не можете делать с ним все.

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

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

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

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

Команду dir также можно запустить из консоли восстановления Windows с другими параметрами. Дополнительные сведения см. в разделе Среда восстановления Windows (WinRE).

Синтаксис

Параметры

  • d — Каталоги
  • h — Скрытые файлы
  • s — Системные файлы
  • l — Точки повторной обработки
  • r — файлы только для чтения
  • a — Файлы готовы к архивированию
  • i — Файлы, не проиндексированные по содержимому
  • n — в алфавитном порядке по имени
  • e – в алфавитном порядке.
  • g – сначала сгруппировать каталоги
  • s – по размеру, начиная с самого маленького.
  • d — по дате/времени, начиная с самых старых
  • Используйте префикс -, чтобы изменить порядок сортировки
  • c — Создание
  • a — Последнее обращение
  • w – Последнее сообщение

Примечания

Чтобы использовать несколько параметров filename, разделяйте каждое имя файла пробелом, запятой или точкой с запятой.

Вы можете использовать подстановочные знаки (* или ?) для представления одного или нескольких символов имени файла и для отображения подмножества файлов или подкаталогов.

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

dir *.txt перечисляет все файлы в текущем каталоге с расширениями, начинающимися с .txt, например .txt, .txt1, .txt_old.

dir read *.txt перечисляет все файлы в текущем каталоге, имена которых начинаются с read и расширения которых начинаются с .txt, например .txt, .txt1 или .txt_old.

dir read *.* перечисляет все файлы в текущем каталоге, которые начинаются с read с любым расширением.

Подстановочный знак звездочки всегда использует сопоставление коротких имен файлов, поэтому вы можете получить неожиданные результаты. Например, следующий каталог содержит два файла (t.txt2 и t97.txt):

Вы можете ожидать, что при вводе dir t97\* будет возвращен файл t97.txt. Однако если ввести dir t97\*, будут возвращены оба файла, поскольку подстановочный знак звездочки сопоставляет файл t.txt2 с t97.txt, используя его карту коротких имен T97B4~1.TXT. Аналогично, если ввести del t97\*, то оба файла будут удалены.

Можно использовать вопросительный знак (?) вместо одного символа в имени. Например, набрав dir read. txt перечисляет все файлы в текущем каталоге с расширением .txt, которые начинаются с чтения и за которыми следует до трех символов. Сюда входят файлы Read.txt, Read1.txt, Read12.txt, Read123.txt и Readme1.txt, но не файлы Readme12.txt.

Если вы используете /a с более чем одним значением в атрибутах, эта команда отображает имена только тех файлов со всеми указанными атрибутами. Например, если вы используете /a с r и -h в качестве атрибутов (используя либо /a:rh, либо /ar-h ), эта команда отобразит только имена файлов только для чтения, которые не скрыты.< /p>

Если вы укажете более одного значения sortorder, эта команда сортирует имена файлов по первому критерию, затем по второму критерию и так далее. Например, если вы используете /o с параметрами e и -s для порядка сортировки (используя либо /o:es, либо /oe-s ), эта команда сортирует имена каталогов и файлов по расширению. , начиная с наибольшего, а затем отображает окончательный результат. Алфавитная сортировка по расширению приводит к тому, что сначала отображаются имена файлов без расширений, затем имена каталогов, а затем имена файлов с расширениями.

Если вы используете символ перенаправления ( > ) для отправки вывода этой команды в файл или если вы используете канал ( | ) для отправки вывода этой команды другой команде, вы должны использовать /a:-d и /b только список имен файлов. Вы можете использовать имя файла с параметрами /b и /s, чтобы указать, что эта команда предназначена для поиска в текущем каталоге и его подкаталогах всех имен файлов, которые соответствуют имя файла. Эта команда выводит только букву диска, имя каталога, имя файла и расширение имени файла (по одному пути в строке) для каждого найденного имени файла. Прежде чем использовать конвейер для отправки вывода этой команды другой команде, необходимо установить переменную среды TEMP в файле Autoexec.nt.

Примеры

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

В выходных данных перечислены корневой каталог, подкаталоги и файлы в корневом каталоге, включая расширения. Эта команда также выводит список имен подкаталогов и имен файлов в каждом подкаталоге дерева.

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

Чтобы распечатать список каталогов, введите:

Когда вы указываете prn, список каталогов отправляется на принтер, подключенный к порту LPT1. Если ваш принтер подключен к другому порту, вы должны заменить prn именем правильного порта.

Вы также можете перенаправить вывод команды dir в файл, заменив prn именем файла. Вы также можете ввести путь. Например, чтобы направить вывод каталога в файл dir.doc в каталоге Records, введите:

Если каталог dir.doc не существует, каталог dir создает его, если только каталог Records не существует. В этом случае появится следующее сообщение:

Чтобы отобразить список всех имен файлов с расширением .txt во всех каталогах на диске C, введите:

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

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

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: где-то по пути возникла страсть.

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

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

Возвращает список файлов из текущего каталога.

Перегрузки

Возвращает список файлов из текущего каталога, соответствующий указанному шаблону поиска и параметрам перечисления.

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

Возвращает список файлов из текущего каталога.

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

GetFiles(String, EnumerationOptions)

Возвращает список файлов из текущего каталога, соответствующий указанному шаблону поиска и параметрам перечисления.

Параметры

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

Объект, описывающий используемую конфигурацию поиска и перечисления.

Возврат

Массив строго типизированных объектов FileInfo, соответствующих searchPattern и enumerationOptions .

Исключения

searchPattern имеет значение null .

Недопустимый путь (например, он находится на несопоставленном диске).

У вызывающего абонента нет необходимого разрешения.

Примечания

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

Подстановочный знак Соответствия
* (звездочка) Ноль или более символов в этой позиции.
? (вопросительный знак) Ноль или один символ в этой позиции.

Символы, кроме подстановочных знаков, являются буквальными символами. Например, строка «*t» ищет все имена, оканчивающиеся на букву «t». Строка searchPattern "s*" ищет все имена в пути, начинающемся с буквы "s".

Методы EnumerateFiles и GetFiles различаются следующим образом:

При использовании EnumerateFiles можно начать перечисление коллекции объектов FileInfo до того, как будет возвращена вся коллекция.

При использовании GetFiles необходимо дождаться возврата всего массива объектов FileInfo, прежде чем вы сможете получить к нему доступ.

Поэтому, когда вы работаете с большим количеством файлов и каталогов, EnumerateFiles может быть более эффективным.

Если в DirectoryInfo нет файлов, этот метод возвращает пустой массив.

В параметре searchPattern разрешены следующие подстановочные знаки.

Подстановочный знак Описание
* Ноль или более символов.
? Точно ноль или один символ.

Порядок возвращаемых имен файлов не гарантируется; используйте метод Sort, если требуется определенный порядок сортировки.

Подстановочные знаки разрешены. Например, строка searchPattern "*.txt" ищет все имена файлов с расширением "txt". Строка searchPattern "s*" ищет все имена файлов, начинающиеся с буквы "s". Если нет файлов или нет файлов, соответствующих строке searchPattern в DirectoryInfo, этот метод возвращает пустой массив.

При использовании подстановочного знака звездочки в шаблоне поиска (например, "*.txt") поведение сопоставления зависит от длины указанного расширения файла. searchPattern с расширением файла ровно из трех символов возвращает файлы с расширением из трех или более символов, где первые три символа соответствуют расширению файла, указанному в searchPattern . searchPattern с расширением файла из одного, двух или более трех символов возвращает только файлы с расширениями точно такой же длины, которые соответствуют расширению файла, указанному в searchPattern . При использовании подстановочного знака вопросительного знака этот метод возвращает только файлы, соответствующие указанному расширению файла. Например, при наличии двух файлов в каталоге, «file1.txt» и «file1.txtother», шаблон поиска «file?.txt» возвращает только первый файл, а шаблон поиска «file*.txt» возвращает оба файла.

Поскольку этот метод проверяет имена файлов как в формате имени файла 8.3, так и в формате длинного имени файла, шаблон поиска, аналогичный "*1*.txt", может возвращать неожиданные имена файлов. Например, при использовании шаблона поиска "*1*.txt" будет возвращено "longfilename.txt", поскольку эквивалентный формат имени файла версии 8.3 будет "longf~1.txt".

Этот метод предварительно заполняет значения следующих свойств FileInfo:

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

glob — найти пути, соответствующие шаблону

Описание

Функция glob() ищет все пути, соответствующие шаблону, в соответствии с правилами, используемыми функцией libc glob(), которые аналогичны правилам, используемым в обычных оболочках.

Параметры

Шаблон. Расширение тильды или подстановка параметров не выполняются.

  • * — соответствует нулю или более символов.
  • <ли>? - Соответствует ровно одному символу (любому символу).
  • [. ] — соответствует одному символу из группы символов. Если первый символ ! , соответствует любому символу, не входящему в группу.
  • \ — экранирует следующий символ, за исключением случаев, когда используется флаг GLOB_NOESCAPE.
  • GLOB_MARK – добавляет косую черту (обратную косую черту в Windows) к каждому возвращаемому каталогу.
  • GLOB_NOSORT — возвращает файлы в том виде, в котором они появляются в каталоге (без сортировки). Если этот флаг не используется, пути сортируются в алфавитном порядке
  • GLOB_NOCHECK — возвращает шаблон поиска, если не найдено ни одного файла, соответствующего ему.
  • GLOB_NOESCAPE — обратная косая черта не заключает метасимволы в кавычки.
  • GLOB_BRACE – расширяется до соответствия буквам "a", "b" или "c"
  • GLOB_ONLYDIR — возвращает только те записи каталога, которые соответствуют шаблону
  • GLOB_ERR — останавливаться при ошибках чтения (например, нечитаемых каталогах), по умолчанию ошибки игнорируются.

Примечание. Флаг GLOB_BRACE недоступен в некоторых системах, отличных от GNU, таких как Solaris или Alpine Linux.

Возвращаемые значения

Возвращает массив, содержащий совпадающие файлы/каталоги, пустой массив, если не найден ни один файл, или false в случае ошибки.

Примечание:

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

Примеры

foreach ( glob ("*.txt" ) as $filename ) echo "$filename size" . размер файла ($имя_файла). "\n" ;
>
?>

Приведенный выше пример выведет что-то похожее на:

Примечания

Примечание. Эта функция не будет работать с удаленными файлами, поскольку файл для проверки должен быть доступен через файловую систему сервера.

Примечание. Эта функция недоступна в некоторых системах (например, в старых ОС Sun).

См. также

  • opendir() — открыть дескриптор каталога
  • readdir() — чтение записи из дескриптора каталога
  • closedir() — закрыть дескриптор каталога
  • fnmatch() — сопоставление имени файла с шаблоном

Пользовательские заметки 48 заметок

Поскольку я чувствую, что это довольно расплывчато и бесполезно, я решил сделать пост с подробным описанием механики регулярного выражения glob.

glob использует два специальных символа, которые действуют как смесь метасимвола и квантификатора. Эти два символа — * и ?

? соответствует 1 любому символу, кроме /
* соответствует 0 или более любому символу, кроме /

Если это поможет, подумайте о * как о pcre-эквиваленте .* и ? как pcre-эквивалент точки (.)

Примечание: * и ? функционировать независимо от предыдущего символа. Например, если вы сделаете glob("a*.php") для следующего списка файлов, будут возвращены все файлы, начинающиеся с "a", но сам * будет соответствовать:

a.php // * ничего не соответствует
aa.php // * соответствует второму 'a'
ab.php // * соответствует 'b'
abc.php // * соответствует 'bc'
b.php // * ничему не соответствует, потому что начальный 'a' не соответствует
bc.php // * ничему не соответствует, потому что начальный 'a' не соответствует
bcd .php // * ничего не соответствует, потому что начальная буква 'a' неверна

Оно не соответствует только a.php и aa.php, как "обычное" регулярное выражение, потому что оно соответствует 0 или более любых символов, а не символу/классу/группе перед ним.

Выполнение glob("a?.php") для того же списка файлов вернет только aa.php и ab.php, потому что, как уже упоминалось, ? является эквивалентом точки pcre и НЕ совпадает с символом pcre ?, который соответствует 0 или 1 предыдущего символа.

Регулярное выражение glob также поддерживает классы символов и классы отрицательных символов, используя синтаксис [] и [^]. Он будет соответствовать любому символу внутри [] или любому символу, которого нет в [^].

С тем же списком выше, выполнение

glob("[ab]*.php) вернет (все):
a.php // [ab] соответствует 'a', * ничего не соответствует
aa.php // [ab] соответствует 'a', * соответствует второму 'a'
ab.php // [ab] соответствует 'a', * соответствует 'b'
abc.php // [ab] соответствует ' a', * соответствует 'bc'
b.php // [ab] соответствует 'b', * ничему не соответствует
bc.php // [ab] соответствует 'b', * соответствует 'c'
bcd.php // [ab] соответствует 'b', * соответствует 'cd'

glob("[ab].php") вернет a.php и b.php

glob("[^a]*.php") вернет:
b.php // [^a] соответствует 'b', * ничего не соответствует
bc.php // [^ a] соответствует 'b', * соответствует 'c'
bcd.php // [^a] соответствует 'b', * соответствует 'cd'

glob("[^ab]*.php") ничего не вернет, поскольку класс символов не совпадет с первым символом.

Вы также можете использовать диапазоны символов внутри класса символов, используя начальный и конечный символы с дефисом между ними. Например, [a-z] соответствует любой букве от a до z, 3 соответствует любой (одной) цифре и т. д.

glob также поддерживает ограниченное чередование с . Вы должны указать GLOB_BRACE в качестве второго аргумента для glob, чтобы он работал. Так, например, если вы выполнили команду glob(".php", GLOB_BRACE) для следующего списка файлов:

все трое вернутся. Примечание: использование чередования с такими одиночными символами — это то же самое, что просто выполнить команду glob("[abc].php"). Более интересным примером может быть glob("te.php", GLOB_BRACE) on:

tent.php
text.php
test.php
tense.php

text.php и tense.php будут возвращены из этого шаблона.

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

a.php
aa.php
aaa.php
ab.php
abc.php
b.php
bc.php

с регулярным выражением pcre вы можете сделать ~^a+\.php$~ для возврата

Это невозможно с помощью glob. Если вы пытаетесь сделать что-то подобное, вы можете сначала сузить его с помощью glob, а затем получить точные совпадения с помощью полноценного механизма регулярных выражений. Например, если вы хотите, чтобы все php-файлы в предыдущем списке содержали только одну или несколько букв «а», вы можете сделать это:

$list = glob ("a*.php");
foreach ( $list as $l ) <
if ( preg_match («~^a+\.php$~», $file ))
$files [] = $l ;
>
?>

glob также не поддерживает просмотр назад, просмотр вперед, атомарное группирование, захват или любую из функций регулярных выражений «более высокого уровня».

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