На этот вопрос уже есть ответ здесь:
В каталоге и его подпапки мне нужно увидеть все файлы с расширением png
.
Для этого я использовал команду ls -R * .png
Я получаю сообщение об ошибке, что каталог *. Png
не существует. Я удивлен, что мое регулярное выражение не распознается.
ls: Cannot read '*.png': the file or the directory doesn't exist
Корректное использование
ls -R | grep '\.png$'
Эта команда только работает с нормальными именами файлов без пространства, символов новой строки или специальных символов. Использовать find
как предложено danzel или globstar, как предложено DoVo.
TL; DR
Для нахождения файлов, соответствующих регулярному выражению, использование находит с -regex
опция:
find [startingPath] -type [fileType] -regex "[regularExpression]"
В Вашем случае, если Вы хотите искать файлы (тип файла f
) окончание в .png
, запуск с текущего каталога:
find . -type f -regex ".*\.pdf"
Если Вы хотите иметь ls
- как вывод, используйте -ls
действие:
find . -type f -regex ".*\.pdf" -ls
(вывод имеет тот же формат как ls -dils
).
Если Вы хотите выполнить команду для каждого файла, используйте -exec
действие, например:
find . -type f -regex ".*\.pdf" -exec file {} \;
... распечатает информацию о типе файла для каждого файла соответствия.
Существует намного больше вещей, которые можно сделать с находкой, просто прочитать руководство.
Как @steeldriver сказал в комментарии, в Вашей команде нет никакого регулярного выражения. *.png
шарик оболочки и расширен прежде ls
выполняется. Предположите, что в текущем каталоге существует два файла:
picture1.png
picture2.png
... затем ls -R *.png
будет расширен до:
ls -R picture1.png picture2.png
В этом случае, -R
опция не особенно полезна, потому что нет никаких каталогов, указанных это ls
мог рекурсивно вызвать в.
Если оболочка не находит имени соответствия, она передает аргумент буквально (зависит от оболочки, но удар делает):
ls -R *.png
... и ls
жалуется, потому что нет никакого названного файла *.png
.
Другая опция вместо find
было бы использование globstar:
shopt -s globstar
ls **/*.png
Дополнительно сброс globstar впоследствии:
shopt -u globstar
От bash
страница справочника:
globstar
If set, the pattern ** used in a pathname expansion context will
match all files and zero or more directories and subdirectories.
If the pattern is followed by a /, only directories and
subdirectories match.