Рекурсивный запуск `ls` с подстановочными знаками

Рекурсивный запуск `ls` с подстановочными знаками

Я пытаюсь найти все файлы проекта определенного типа с помощью:

ls -ltR *.mb

Я знаю, что нужные мне файлы есть в нескольких папках, но я не получаю никаких результатов. Что я сделал не так?

решение1

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

Стандартный способ рекурсивного перечисления файлов — использоватьfind

find . -name '*.mb' -type f -printf "%-.22T+ %M %n %-8u %-8g %8s %Tx %.8TX %p\n" | sort | cut -f 2- -d ' '

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


Альтернативный способ — использоватьglobstarкоторый может быть включен с помощьюshopt -s globstar

ls -ltR **/*.mb

Первый **/будет соответствовать любым произвольным путям подкаталогов. Затем *.mbсопоставьте ваши файлы в этих каталогах

  • глобстар

    Если установлено, шаблон, **используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулю или более каталогам и подкаталогам. Если за шаблоном следует /, будут соответствовать только каталоги и подкаталоги.

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

решение2

У @phuclv есть два хороших варианта. Когда мне нужно сделать что-то подобное, я обычно передаю вывод ls в grep следующим образом:

ls -ltR | grep .*\.mb

это отправит вывод ls на вход grep вместо вывода на stdout, а затем grep выведет только те строки, которые содержат хотя бы одно совпадение с регулярным выражением.

Регулярное выражение

.*\.mb

можно объяснить так:

.: match any character
*: preceding character or group should appear 0 or more times
\.mb: literally .mb

Связанный контент