Linux find вложенные папки

Find files in multiple folder names

I am trying to list all the files from dir1 , dir2 , dir3 and dir4 which might be anywhere in as a sub directory of my cwd using the find command. I tried the following with no success:

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+' 

find . -type f -regextype sed -regex «.*/dir1/[a-z0-9]*».. shortest answer so far 🙂 see answer below.. unix.stackexchange.com/a/390333/242983

7 Answers 7

And if you want to search three folders named foo , bar , and baz for all *.py files, use this command:

so if you want to display files from dir1 dir2 dir3 use find dir1 dir2 dir3 -type f

try this find . \( -name «dir1» -o -name «dir2» \) -exec ls ‘<>‘ \;

I should have clarified. I might not have the path to the files I wish to search. I only know they are sub directories of the current dir.

The dir would still need to be in the cwd though, it may be two levels lower (e.g. ./path/to/dir1 ), in which case ./dir1 would not exist.

It’s best to use the -path directive:

find . \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \) 

Which means: find all files under current directory where there’s ‘dir1’ or ‘dir2’ or ‘dir3’ or ‘dir4’ in the path.

You’ve got the parenthesis in the wrong place. See also -a and -o for the standard equivalent of GNU’s -and / -or .

Just to let everyone know. Adding .*/ before each dir solved the problem since the regex is matching against the full path it seems.

This is my first idea after reading the previous answers:

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+" 

This takes into account, that the regex must match the whole filename, and it is easier to understand.

Читайте также:  Копировать директории в линукс

Sample of fast(!) finding particular files (access_log) in multiple locations defined by wildcard (home directory) and general apache2 log directory applying also name filtering to exclude ssl logs and gzipped old logs. Does not directly answer the question here but might be userful for someone who found these instructions (like me).

find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f -name "*access_log" ! -name "*ssl*" 

Be careful with spaces, specially near to \( and \) .

By the way, I used it for apachetop, to find most active websites in my server.

apachetop -d1 -s9 -p $(find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/) 

Источник

Команда find: широкие возможности для поиска файлов в Linux

В Linux есть очень мощная и полезная команда для поиска файлов — команда find. Она обладает большим количеством возможностей для поиска файлов, однако, иногда вызывает сложности у новичков во многом из-за ее синтаксиса.

Простой пример использования команды find

Для начала рассмотрим простой пример использования команды find для поиска на компьютере файлов с именем config . Мы будем искать файлы config , начиная с корневого каталога / . Для этого вам нужно выполнять команду от имени пользователя root , чтобы иметь достаточно прав доступа, иначе получите сообщения «Permission denied». Итак, выполним команду:

Команда означает следующее: искать файлы с именем config (-name config), начиная с каталога / (первый параметр команды find ) и выводить имена файлов на экран (аргумент -print). Отмечу, что поиск рекурсивный, то есть при поиске просматриваются все вложенные директории. Как видите все просто. Теперь рассмотрим синтаксис команды и перейдем к обзору ее основных аргументов.

Синтаксис команды find

Общий синтаксис команды find , который вы можете найти в справочном руководстве, может показаться не совсем простым, поэтому я приведу более удобный для восприятия:

find [путь] [опции] [критерии поиска] [действия над файлами]

Путь

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

Читайте также:  Развернуть домен на linux

Опции

Опции команды find указываются, начиная с символа «-», за которым следует название опции. Рассмотрим основные опции.

-depth (или -d) Поиск в подкаталогах перед поиском в самом каталоге.
-L При поиске следовать по символическим ссылкам.
-maxdepth N При поиске проверять не более чем N вложенных уровней каталогов.
-mindepth N Не проверять вложенные каталоги уровня N и меньше.
-mount Не искать в каталогах других файловых систем.

Критерии поиска

У команды find может быть несколько критериев поиска (их также называют tests ). Каждый критерий представляет собой определенное условие проверки, которое возвращает либо true либо false . Это можно сравнить с условиями оператора if в программировании. В процессе обработки очередного файла команда find по очереди проверяет каждый критерий, и если очередной критерий возвращает false , тогда команда find переходит к следующему файлу. Критериев у команды find довольно много, мы рассмотрим только некоторые из них.

-atime N Последний раз к файлу обращались N дней назад.
-mtime N Последнее изменение файла было N дней назад.
-name шаблон Имя файла (шаблон имени) без указания пути. Рекомендуется всегда заключать шаблон в кавычки.
-newer другой_файл Файл был изменен позже, чем другой_файл .
-size [±] N [cwbkMG] Размер файла равен N блокам, если указано +N , тогда размер файла больше N , -N — меньше. Символ после N означает размер блока. b — 512 байт, с — байт, w — 2 байта, k — килобайт, M — мегабайт, G — гигабайт.
-type C Файл типа C . Наиболее часто используемые значения для С : d — каталог, f — файл.
-user Имя_пользователя Файл принадлежит пользователю с именем Имя_пользователя .

Примеры использования команды find с использованием критериев

Найти в текущем каталоге обычные файлы (не каталоги), имя которых начинается с символа «~».

Найти в текущем каталоге файлы, измененные позже, чем файл file.bak .

find . -newer file.bak -type f -print

Операторы

Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.

Короткая форма оператора Длинная форма Описание
! критерий -not Отрицание (возвращает true , если критерий false )
критерий1 -a критерий2 -and Оператор И ( true , если критерий1 и критерий2 true )
критерий1 -o критерий2 -or Оператор ИЛИ ( true , если критерий1 или критерий2 true )
Читайте также:  Linux mount dev sdb

В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.

Примеры использования команды find с использованием операторов

Найти в текущем каталоге файлы, начинающиеся с символа «~» или c «temp» и являющиеся именно обычными файлами (-type f ), а не каталогами.

find . \( -name "~*" -or -name "temp*" \) -type f -print

Найти в текущем каталоге (не обрабатывая подкаталоги — -maxdeph 1) обычные файлы (-file f) размером больше 600 мегабайт и менее 1 гигабайта (-size) или файлы имя которых заканчивающиется на «.mpeg» (-name).

find . -maxdepth 1 \( \( -size +600M -and -size -1G \) -or -name "*.mpeg" \) -and -type f

Действия над файлами

Когда выполняется команда find , вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.

-exec команда \; Выполнить команду. Обратите внимание, что после команды ставится обратный слеш и точка с запятой.
-execdir команда \; То же самое что и exec, но команда вызывается из подкаталога, содержащего текущий файл.
-ok команда \; То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды.
-okdir команда \; То же что ok для execdir.
-print Вывод имени файла на экран.
-ls Выполнение команды ls -dils над текущим файлом.

В выполняемых командах вы можете использовать параметр <> в качестве аргумента, который заменяется путем к текущему файлу.

Примеры использования команды find с использованием действий

Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).

find . -size +1000c -type f -ls

Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm ).

Заключение

В заметке мы рассмотрели очень важную и полезную Linux команду find , которая предоставляет практически неограниченные возможности для поиска файлов по многим критериям и шаблонам. А с использованием команд (действий) вы можете искать файлы и выполнять над ними любые операции.

Источник

Оцените статью
Adblock
detector