Как "grep" для имени файла вместо содержимого файла?

grep используется для поиска в файле, чтобы увидеть, соответствует ли какая-либо строка данному регулярному выражению. Однако у меня есть такая ситуация - я хочу написать регулярное выражение, которое будет соответствовать самому имени файла (а не содержимому файла). Я запустил это из корневого каталога системы, чтобы найти все те файлы, которые соответствуют регулярному выражению.

Например, если я хочу найти все файлы формы VB, которые начинаются с "f" и заканчиваются на .frm, я буду использовать регулярное выражение -

   "f[[:alnum:]]*\.frm"

Может ли grep сделать это? Если нет, есть ли утилита, которая позволила бы мне это сделать? Благодарю.

Ответ 1

В этом случае вам нужно использовать find вместо grep.

Вы также можете использовать find в комбинации с grep или egrep:

$ find | grep "f[[:alnum:]]\.frm"

Ответ 2

Как сказал Пабло, вам нужно использовать find вместо grep, но нет необходимости в трубе find до grep. find имеет встроенную функциональность:

find . -regex 'f[[:alnum:]]\.frm'

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

Ответ 3

find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

type_descriptor types: -

f: обычный файл

d: каталог

l: символическая ссылка

c: символьные устройства

b: блокировать устройства

Ответ 4

Пример

find <path> -name *FileName*

Из руководства:

find -name pattern

База имени файла (путь с удаленными ведущими каталогами) соответствует шаблону шаблона оболочки. Поскольку ведущие каталоги удаляются, имена файлов, рассматриваемые для соответствия с именем, никогда не будут включая косую черту, так что "-name a/b" никогда не будет соответствовать чему-либо (вам, скорее всего, нужно будет использовать -path). метасимволы ( "*", "?" и "[]" ) соответствуют значению "." в начале базового имени (это изменение в поиске - Utils-4.2.2; см. раздел СТАНДАРТЫ СООТВЕТСТВИЯ ниже). Чтобы игнорировать каталог и файлы под ним, use -prune; см. пример в описании -path. Скобки не признаны как особые, несмотря на то, что некоторые оболочки, включая Bash imbue, скобки со специальным значением в шаблонах оболочки. Соответствие имени файла выполняется с использованием библиотечной функции fnmatch (3). Не забывайте заключить шаблон в кавычки, чтобы защитить его от расширения оболочкой.

Ответ 5

Вы также можете сделать:

tree | grep filename

Это выводит команду дерева для grep для поиска. Это только скажет вам, существует ли файл.

Ответ 6

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

tree -f | grep filename

Вот функция, которую вы можете поместить в свой .bash_profile или .bashrc

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path