Я пытаюсь найти все файлы проекта определенного типа с помощью:
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