Найти все файлы в текущий каталог и его подкаталоги с расширением.png [duplicate]

В каталоге и его подпапки мне нужно увидеть все файлы с расширением png .

Для этого я использовал команду ls -R * .png

Я получаю сообщение об ошибке, что каталог *. Png не существует. Я удивлен, что мое регулярное выражение не распознается.

ls: Cannot read '*.png': the file or the directory doesn't exist
0
задан 18 January 2019 в 12:18

3 ответа

Корректное использование

 ls -R | grep '\.png$'

Эта команда только работает с нормальными именами файлов без пространства, символов новой строки или специальных символов. Использовать find как предложено danzel или globstar, как предложено DoVo.

-2
ответ дан 26 October 2019 в 12:32

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.

5
ответ дан 26 October 2019 в 12:32

Другая опция вместо 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.
1
ответ дан 26 October 2019 в 12:32

Другие вопросы по тегам:

Похожие вопросы: