Практические примеры, которые приведены в этой статье, помогут вам освоить очень эффективную и крайне полезную команду find.
Она используется для поиска файлов и папок через командную строку Linux.
Команда find — одна из самых мощных и широко применимых команд. При этом она крайне объёмная и насчитывает более 50 опций, в которых легко запутаться, особенно в сочетании с командами exec или xargs.
Если вы сисадмин или разработчик, избежать команды find
при работе с командной строкой не получится. Так что давайте научимся её не бояться и пользоваться её возможностями в полной мере.
Для этого разберём самые распространённые случаи практического применения команды find. Но для начала покажу вам синтаксис и принцип работы с командой.
Команда find в Linux
Общий синтаксис команды find выглядит так:
find [directory to search] [options] [expression]
Всё, что в квадратных скобках, указывать необязательно. А значит, выполнить команду find можно вообще без опций и параметров. Она выдаст список всех файлов и папок в текущем расположении. Мало полезного, да?
Так что давайте взглянем на параметры подробнее:
-
directory to search
(папка поиска) — это расположение, с которого вы хотите начать поиск. Поиск по умолчанию рекурсивный и начинается с текущего расположения. -
options
(опции) содержит указание типа поиска: по имени, типу файла, времени изменения и так далее — тут может быть более 50 вариантов. -
expression
(выражение) содержит поисковый запрос. Если вы ищете файл по имени, параметр expression должен содержать имя файла. Если ищете файлы с именем, соответствующим заданному шаблону, поисковое выражение — это шаблон.
Приведу простой пример:
find . -type f -name myfile
Такая команда выполнит поиск файла (именно файла, не папки) с именем myfile
в текущей папке и подпапках. Опция -type f
сужает поиск до файлов. Точка (.
) указывает на текущую папку.
Рассмотрим несколько примеров применения команды find.
Поиск файлов и папок по имени
Так выполняется поиск файлов и папок по имени:
find . -name SEARCH_NAME
Поскольку тип объекта не указан, команда выполняет поиск и файлов, и папок.
Пример ниже — поиск файлов и папок с именем «mystuff»:
abhishek@LHB:~/Examples$ find -name mystuff
./new/mystuff
./mystuff
Поиск только файлов или только папок
Если нужно искать только файлы, на помощь придёт опция type -f:
find . -type f -name SEARCH_NAME
Тип и имя можно указывать в любом порядке. Возьмём пример выше и ограничим круг поиска файлами:
abhishek@LHB:~/Examples$ find -type f -name mystuff
./mystuff
Если нужно найти папку, укажите тип type -d:
find . -type d -name SEARCH_NAME
Вот пример нашего поиска уже по папкам:
abhishek@LHB:~/Examples$ find -type d -name mystuff
./new/mystuff
Поиск без учёта регистра
Команда find по умолчанию учитывает регистр. Чтобы выполнить поиск по имени файла без учёта регистра, надо ввести опцию -iname
вместо -name
.
find . -type f -iname SEARCH_NAME
С поиском по папкам (type -d
) это тоже работает.
abhishek@LHB:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff
Скриншот последних трёх примеров:
Поиск файлов по расширению (важно)
Одно из самых популярных применений команды find — поиск файлов определённого типа, то есть по заданному расширению.
Скажем, вы хотите найти все файлы С++ в текущих папках. Файлы С++ имеют расширение .cpp, и вот как их можно найти:
find . -type f -name "*.cpp"
С такими опциями команда find найдёт только файлы (-type f
) с именами, оканчивающимися на .cpp
.
abhishek@LHB:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp
При работе с командой find всегда заключайте поисковое выражение в двойные кавычки.
С чем связана рекомендация заключать поисковый запрос в двойные или одинарные кавычки? Дело в том, что без кавычек оболочка будет работать с символом * как с джокером и выполнит подстановку.
Вот что будет, если ввести запрос без кавычек:
find . -type f -name *.cpp
Оболочка распознает подстановочный знак * и заменит его всеми файлами в текущей папке, чьи имена заканчиваются на .cpp.
Это сработает, если такой файл всего один, но если их несколько, оболочка пожалуется на некорректный синтаксис.
В нашем случае файл .cpp всего один, и после подстановки команда выглядит так: find . -type f -name file.cpp
. Она работает, поскольку file.cpp
— корректный поисковый запрос.
А вот файлов .txt в той же папке два, и когда команда расширяется до find . -type f -name another.txt new.txt
, выводится предупреждение, потому что поисковых запросов больше одного.
Именно поэтому сам поисковый запрос всегда следует заключать в двойные кавычки.
Поиск нескольких файлов с несколькими расширениями (или условием)
Команда, рассмотренная выше, нужна для поиска файлов по расширению. А что если нужно найти файлы с несколькими разными расширениями?
Вместо того чтобы прогонять команду find несколько раз, введите её один раз с опцией -o, которая работает как логическое условие «или»:
find . -type f -name "*.cpp" -o -name "*.txt"
Например:
abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt
Поиск файлов в заданной папке
Все приведённые примеры иллюстрируют поиск в текущей папке, потому что команда включает в себя точку (.
).
Чтобы выполнить поиск в заданной папке, не покидая текущего расположения, можно заменить точку абсолютным или относительным путём к нужной папке.
abhishek@LHB:~/Examples$ find ./new -name mystuff
./new/mystuff
Поиск файлов в нескольких папках
Если нужные вам файлы могут находиться в нескольких папках, можно выполнить поиск во всех этих расположениях за один раз. Просто укажите все пути к папкам при введении команды find:
find ./location1 /second/location -type f -name "pattern"
Поиск пустых файлов и папок
Опция -empty
позволяет использовать команду find для поиска пустых файлов и папок.
Найти таковые в текущей папке можно следующим образом:
find . -empty
Можно указать тип объектов, чтобы искать только файлы или только папки:
find . -empty -type f
Кроме того, можно в таком режиме искать файлы по имени:
find . -empty -type f -name "*.cpp"
Поиск крупных и мелких файлов (поиск по размеру файла)
Команда find поможет найти крупные или мелкие файлы, если выполнить поиск по размеру. Но это работает только для файлов, не для папок.
Используется опция -size
с аргументом +N для файлов размером более N и -N для файлов размером менее N.
А вот как можно найти файлы точного заданного размера (50 КБ):
find . -size 50k
Так выполняется поиск файлов размером более 1 ГБ в текущей папке:
find . -size +1G
А так — файлов, не превышающих 20 байт:
find . -size -20c
Для поиска файлов размером более 100 МБ, но менее 2ГБ, введите:
find . -size +100M -size -2G
Поиск по размеру тоже можно сочетать с поиском по имени файла. Таким образом, найти в корневом каталоге все файлы размером более 500 МБ с именем, оканчивающимся на .log, можно так:
find / -size +500M -name "*.log"
Для справки:
-
c
– байты -
k
– килобайты -
M
– мегабайты -
G
– гигабайты
Поиск недавно изменённых файлов (поиск по времени изменения или создания)
Вы ведь знакомы с параметрами mtime, atime и ctime?
- Mtime – время последнего изменения файла
- Ctime – время создания файла
- Atime – время последнего доступа к файлу
Вы не раз столкнётесь с ситуацией, когда нужен список всех недавно изменённых файлов. В таких случаях на помощь приходит поиск по времени изменения.
Найти все файлы, претерпевшие изменения за последние трое суток (3*24ч), можно так:
find . -type f -mtime -3
А все файлы, созданные пять и более дней назад, ищутся так:
find . -type f -ctime +5
Понимаю, что 24 часа — большой срок. Что если нужно выявить файлы, изменённые всего пару минут назад? Для этого предусмотрены опции mmin
, amin
и cmin
.
Так выглядит команда поиска всех файлов, изменённых за последние пять минут:
find . -type f -mmin -5
Можно не только указать имя файла, но и ограничить временной промежуток с двух сторон. Команда ниже выполнит поиск всех файлов .java, изменённых не ранее 30 и не позднее 20 минут назад.
find . -type f -mmin +20 -mmin -30 -name "*.java"
Поиск файлов с определёнными настройками доступа
Надеюсь, вы имеете представление о разрешениях файлов в Linux.
Команда find позволяет выполнить поиск файлов по разрешению и режиму доступа.
find -perm mode
Поищем в текущей папке, к примеру, все файлы с режимом доступа 777:
find . -perm 777
А так можно найти все файлы с правами на чтение и запись для всех типов пользователей (только точное совпадение; файлы с правами на выполнение для всех не отобразятся):
find . -perm a=r+w
Поиск файлов по владельцу
Можно также найти файлы, принадлежащие определённому пользователю.
Вот как обнаружить в текущей папке все файлы пользователя Джона:
find . -type f -user John
Эта опция сочетается с другими, будь то размер или время и имя файла:
find . -type f -user John -name "*.cpp"
Отключение рекурсивного поиска для поиска только в текущей папке
По умолчанию команда find выполняет поиск во всех подпапках текущего расположения. Если это не требуется, можно ограничить глубину поиска значением «1». Так вы ограничитесь поиском в текущей папке, не залезая в подпапки.
find . -maxdepth 1 -type f -name "*.txt"
Исключение папки из поиска
Если нет необходимости производить поиск в той или иной папке, можно исключить её с помощью опций path, prune и логического «или».
find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME
Будьте внимательны: путь к папке должен оканчиваться на *, затем идёт -prune
и только потом -o
.
Попросту говоря, при поиске с опцией prune папка, указанная с помощью path, игнорируется. Prune всегда сопровождается флагом -o
(логическое «или»), чтобы папки, которые не были исключены, просматривались на наличие искомого объекта.
Дальнейшая работа с результатами команды find: exec и xargs
Итак, мы изучили различные способы поиска файлов по заданным параметрам. Это хорошо. А теперь следующий шаг: рассмотрим, какие действия можно выполнять с результатами команды find.
Например, как найти файлы с именем, соответствующим определённому шаблону, и переименовать их за одно действие? Или выявить и удалить пустые файлы?
Вам уже известно, что в Linux можно использовать перенаправление ввода-вывода, чтобы объединить результаты одной команды с вводом другой. Но с результатами команды find это не сработает — по крайней мере, не напрямую.
Чтобы выполнить действия над результатом команды find, есть два варианта:
- Применить exec
- Применить xargs
Использование find и exec
Допустим, вам нужен подробный список (ls -l) файлов, найденных командой find. Вот как его получить:
find . -type f -name "*.txt" -exec ls -l {} +
Результат будет таким:
abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt
Многие забывают ввести {} +
в конце команды exec. Но это необходимо — как и пробел между скобками {} и плюсом +.
Фигурные скобки ссылаются на результат выполнения команды find. Их содержимое может иметь следующий вид: {файл 1, файл 2, файл 3}. Символ +
используется как конец команды exec.
Есть ещё один вариант оформления exec:
find . -type f -name "*.txt" -exec ls -l {} ;
В данном случае плюс заменён на точку с запятой. Дополнительная косая черта означает, что точка с запятой не является специальным символом.
Преимущество сочетания {} +
заключается в меньшем количестве команд ( ls -l file1 file2 file3
), тогда как комбинация {} ;
запустит цепочку ls -l file1
, ls -l file2
и так далее.
Однако сочетание {} ;
даёт возможность использовать {}
несколько раз в одном и том же выражении exec. Так, приведённая ниже команда переименует все обнаруженные файлы с расширением .old.
find . -type f -name "*.txt" -exec mv {} {}.old ;
Использование команды xargs
Многие пользователи Linux сталкиваются с необходимостью перенаправления ввода-вывода довольно часто. Но команда exec с цепочкой символов {} +
кажется им слишком сложной.
И тут на помощь приходит xargs. Нужно просто перенаправить вывод команды find в команду xargs через конвейер.
find . -type f -name "*.txt" | xargs ls -l
Синтаксис куда проще, верно? К тому же команда xargs тоже весьма эффективна. Подробнее о ней — в статье по ссылке.
Сочетание команд find и grep
Теперь вы умеете совмещать команду find с xargs и exec, и пора перейти на следующий уровень — объединить find и grep.
Для сисадминов и разработчиков комбинация команд find и grep — одна из самых распространённых и вместе с тем самых полезных.
Команда find находит файлы с именем, соответствующим шаблону, а затем команда grep выполняет поиск по их содержимому.
Например, вам нужно найти все файлы .txt, в которых есть имя «Alice». Объединить команды find и grep можно так:
find . -type f -name "*.txt" -exec grep -i alice {} +
А можно с помощью xargs:
find . -type f -name "*.txt" | xargs grep -i alice
Конечно, пример элементарный, но если команда grep вам знакома, можете использовать её на своё усмотрение.
И это далеко не все возможности команды find…
Перечислить все опции и примеры использования команды find практически невозможно. Её возможностям нет границ, но если вы освоите её принципы, она окажется очень кстати во многих ситуациях. Решающий фактор — как сочетается логика действия разных опций и команд.
Надеюсь, моя подборка примеров использования find была для вас полезна. Если у вас есть вопросы или предложения, как сделать эту статью лучше, добро пожаловать в комментарии.
НЛО прилетело и оставило здесь промокоды для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.
— 20% на выделенные серверы AMD Ryzen и Intel Core — HABRFIRSTDEDIC.
Доступно до 31 декабря 2021 г.
Очень важно уметь вовремя найти нужную информацию в системе. Конечно, все современные файловые менеджеры предлагают отличные функции поиска, но им не сравнится с поиском в терминале Linux. Он намного эффективнее и гибче обычного поиска, вы можете искать файлы не только по имени, но и по дате добавления, содержимому, а также использовать для поиска регулярные выражения.
Кроме того, с найденными файлами можно сразу же выполнять необходимые действия. В этой статье мы поговорим о поиске с помощью очень мощной команды find Linux, подробно разберем её синтаксис, опции и рассмотрим несколько примеров.
Команда find — это одна из наиболее важных и часто используемых утилит системы Linux. Это команда для поиска файлов и каталогов на основе специальных условий. Ее можно использовать в различных обстоятельствах, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим подобным критериям.
Утилита find предустановлена по умолчанию во всех Linux дистрибутивах, поэтому вам не нужно будет устанавливать никаких дополнительных пакетов. Это очень важная находка для тех, кто хочет использовать командную строку наиболее эффективно.
Команда find имеет такой синтаксис:
find [папка] [параметры] критерий шаблон [действие]
Папка — каталог в котором будем искать
Параметры — дополнительные параметры, например, глубина поиска, и т д
Критерий — по какому критерию будем искать: имя, дата создания, права, владелец и т д.
Шаблон — непосредственно значение по которому будем отбирать файлы.
Основные параметры команды find
Я не буду перечислять здесь все параметры, рассмотрим только самые полезные.
- -P — никогда не открывать символические ссылки.
- -L — получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл.
- -maxdepth — максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1.
- -depth — искать сначала в текущем каталоге, а потом в подкаталогах.
- -mount искать файлы только в этой файловой системе.
- -version — показать версию утилиты find.
- -print — выводить полные имена файлов.
- -type f — искать только файлы.
- -type d — поиск папки в Linux.
Критерии
Критериев у команды find в Linux очень много, и мы опять же рассмотрим только основные.
- -name — поиск файлов по имени.
- -perm — поиск файлов в Linux по режиму доступа.
- -user — поиск файлов по владельцу.
- -group — поиск по группе.
- -mtime — поиск по времени модификации файла.
- -atime — поиск файлов по дате последнего чтения.
- -nogroup — поиск файлов, не принадлежащих ни одной группе.
- -nouser — поиск файлов без владельцев.
- -newer — найти файлы новее чем указанный.
- -size — поиск файлов в Linux по их размеру.
Примеры использования
А теперь давайте рассмотрим примеры find, чтобы вы лучше поняли, как использовать эту утилиту.
1. Поиск всех файлов
Показать все файлы в текущей директории:
find
find .
find . -print
Все три команды покажут одинаковый результат. Точка здесь означает текущую папку. Вместо неё можно указать любую другую.
2. Поиск файлов в определенной папке
Показать все файлы в указанной директории:
find ./Изображения
Искать файлы по имени в текущей папке:
find . -name "*.png
Поиск по имени в текущей папке:
find . -name "testfile*"
Не учитывать регистр при поиске по имени:
find . -iname "TeStFile*"
3. Ограничение глубины поиска
Поиска файлов по имени в Linux только в этой папке:
find . -maxdepth 1 -name "*.php"
4. Инвертирование шаблона
Найти файлы, которые не соответствуют шаблону:
find . -not -name "test*"
5. Несколько критериев
Поиск командой find в Linux по нескольким критериям, с оператором исключения:
find . -name "test" -not -name "*.php"
Найдет все файлы, начинающиеся на test, но без расширения php. А теперь рассмотрим оператор ИЛИ:
find -name "*.html" -o -name "*.php"
Эта команда найдёт как php, так и html файлы.
6. Тип файла
По умолчанию find ищет как каталоги, так и файлы. Если вам необходимо найти только каталоги используйте критерий type с параметром d. Например:
find . -type d -name "Загрузки"
Для поиска только файлов необходимо использовать параметр f:
find . -type f -name "Загрузки"
6. Несколько каталогов
Искать в двух каталогах одновременно:
find ./test ./test2 -type f -name "*.c"
7. Поиск скрытых файлов
Найти скрытые файлы только в текущей папке. Имена скрытых файлов в Linux начинаются с точки:
find . -maxdepth 1 -type f -name ".*"
8. Поиск по разрешениям
Найти файлы с определенной маской прав, например, 0664:
find . -type f -perm 0664
Права также можно задавать буквами для u (user) g (group) и o (other). Например, для того чтобы найти все файлы с установленным флагом Suid в каталоге /usr выполните:
sudo find /usr -type f -perm /u=s
Поиск файлов доступных владельцу только для чтения только в каталоге /etc:
find /etc -maxdepth 1 -perm /u=r
Найти только исполняемые файлы:
find /bin -maxdepth 2 -perm /a=x
9. Поиск файлов в группах и пользователях
Найти все файлы, принадлежащие пользователю:
find . -user sergiy
Поиск файлов в Linux принадлежащих группе:
find /var/www -group www-data
10. Поиск по дате модификации
Поиск файлов по дате в Linux осуществляется с помощью параметра mtime. Найти все файлы модифицированные 50 дней назад:
find / -mtime 50
Поиск файлов в Linux открытых N дней назад:
find / -atime 50
Найти все файлы, модифицированные между 50 и 100 дней назад:
find / -mtime +50 -mtime -100
Найти файлы измененные в течении часа:
find . -cmin 60
11. Поиск файлов по размеру
Найти все файлы размером 50 мегабайт:
find / -size 50M
От пятидесяти до ста мегабайт:
find / -size +50M -size -100M
Найти самые маленькие файлы:
find . -type f -exec ls -s {} ; | sort -n -r | head -5
Самые большие:
find . -type f -exec ls -s {} ; | sort -n | head -5
12. Поиск пустых файлов и папок
find /tmp -type f -empty
find ~/ -type d -empty
13. Действия с найденными файлами
Для выполнения произвольных команд для найденных файлов используется опция -exec. Например, для того чтобы найти все пустые папки и файлы, а затем выполнить ls для получения подробной информации о каждом файле используйте:
find . -empty -exec ls -ld {} ;
Удалить все текстовые файлы в tmp
find /tmp -type f -name "*.txt" -exec rm -f {} ;
Удалить все файлы больше 100 мегабайт:
find /home/bob/dir -type f -name *.log -size +100M -exec rm -f {} ;
Выводы
Вот и подошла к концу эта небольшая статья, в которой была рассмотрена команда find. Как видите, это одна из наиболее важных команд терминала Linux, позволяющая очень легко получить список нужных файлов. Ее желательно знать всем системным администраторам. Если вам нужно искать именно по содержимому файлов, то лучше использовать команду grep.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Обновлено: 01.02.2022
Опубликовано: 25.07.2016
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Синтаксис
Примеры
Поиск по имени
По дате
По типу файла
По правам
По содержимому
С сортировкой по дате изменения
Лимиты
Действия над найденными объектами
Запуск по расписанию в CRON
Общий синтаксис
find <где искать> <опции>
<где искать> — путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».
<опции> — набор правил, по которым выполнять поиск.
* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.
Описание опций
Опция | Описание |
---|---|
-name | Поиск по имени. |
-iname | Регистронезависимый поиск по имени. |
-type |
Тип объекта поиска. Возможные варианты:
|
-size | Размер объекта. Задается в блоках по 512 байт или просто в байтах (с символом «c»). |
-mtime | Время изменения файла. Указывается в днях. |
-mmin | Время изменения в минутах. |
-atime | Время последнего обращения к объекту в днях. |
-amin | Время последнего обращения в минутах. |
-ctime | Последнее изменение владельца или прав на объект в днях. |
-cmin | Последнее изменение владельца или прав в минутах. |
-user | Поиск по владельцу. |
-group | По группе. |
-perm | С определенными правами доступа. |
-depth | Поиск должен начаться не с корня, а с самого глубоко вложенного каталога. |
-maxdepth | Максимальная глубина поиска по каталогам. -maxdepth 0 — поиск только в текущем каталоге. По умолчанию, поиск рекурсивный. |
-prune | Исключение перечисленных каталогов. |
-mount | Не переходить в другие файловые системы. |
-regex | По имени с регулярным выражением. |
-regextype <тип> | Тип регулярного выражения. |
-L или -follow | Показывает содержимое символьных ссылок (симлинк). |
-empty | Искать пустые каталоги. |
-delete | Удалить найденное. |
-ls | Вывод как ls -dgils |
Показать найденное. | |
-print0 | Путь к найденным объектам. |
-exec <команда> {} ; | Выполнить команду над найденным. |
-ok | Выдать запрос перед выполнением -exec. |
Также доступны логические операторы:
Оператор | Описание |
---|---|
-a | Логическое И. Объединяем несколько критериев поиска. |
-o | Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска. |
-not или ! | Логическое НЕ. Инвертирует критерий поиска. |
Полный набор актуальных опций можно получить командой man find.
Примеры использования find
Поиск файла по имени
1. Простой поиск по имени:
find / -name «file.txt»
* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.
2. Поиск файла по части имени:
find / -name «*.tmp»
* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp
3. Несколько условий.
а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:
find . -name «sess_*» -a -name «*cd»
б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:
find . -name «sess_*» -o -name «*cd»
в) Более компактный вид имеют регулярные выражения, например:
find . -regex ‘.*/(sess_.*cd)’
find . -regex ‘.*/(sess_.*|.*cd)’
* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).
4. Найти все файлы, кроме .log:
find . ! -name «*.log»
* в данном примере мы воспользовались логическим оператором !.
Поиск по дате
1. Поиск файлов, которые менялись определенное количество дней назад:
find . -type f -mtime +60
* данная команда найдет файлы, которые менялись более 60 дней назад.
Или в промужутке:
find . -mmin -20 -mmin +10 -type f
* найти все файлы, которые менялись более 10 минут, но не более 20-и.
2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find —version).
а) дате изменения:
find . -type f -newermt «2019-11-02 00:00»
* покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.
find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02
* найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).
б) дате обращения:
find . -type f -newerat 2019-10-08
* все файлы, к которым обращались с 08.10.2019.
find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01
* все файлы, к которым обращались в октябре.
в) дате создания:
find . -type f -newerct 2019-09-07
* все файлы, созданные с 07 сентября 2019 года.
find . -type f -newerct 2019-09-07 ! -newerct «2019-09-09 07:50:00»
* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50
По типу
Искать в текущей директории и всех ее подпапках только файлы:
find . -type f
* f — искать только файлы.
Поиск по правам доступа
1. Ищем все справами на чтение и запись:
find / -perm 0666
2. Находим файлы, доступ к которым имеет только владелец:
find / -perm 0600
Поиск файла по содержимому
find / -type f -exec grep -i -H «content» {} ;
* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.
С сортировкой по дате модификации
find /data -type f -printf ‘%TY-%Tm-%Td %TT %pn’ | sort -r
* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.
Лимит на количество выводимых результатов
Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:
find /data -type f -printf ‘%TY-%Tm-%Td %TT %pn’ | sort -r | head -n 1
Поиск с действием (exec)
1. Найти только файлы, которые начинаются на sess_ и удалить их:
find . -name «sess_*» -type f -print -exec rm {} ;
* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.
2. Переименовать найденные файлы:
find . -name «sess_*» -type f -exec mv {} new_name ;
или:
find . -name «sess_*» -type f | xargs -I ‘{}’ mv {} new_name
3. Переместить найденные файлы:
find . -name «sess_*» -type f -exec mv {} /new/path/ ;
* в данном примере мы переместим все найденные файлы в каталог /new/path/.
4. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:
find . -name «*.tmp» | wc -l
5. Изменить права:
find /home/user/* -type d -exec chmod 2700 {} ;
* в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.
6. Передать найденные файлы конвееру (pipe):
find /etc -name ‘*.conf’ -follow -type f -exec cat {} ; | grep ‘test’
* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.
7. Произвести замену в файлах с помощью команды sed:
find /opt/project -type f -exec sed -i -e «s/test/production/g» {} ;
* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.
Чистка по расписанию
Команду find удобно использовать для автоматического удаления устаревших файлов.
Открываем на редактирование задания cron:
crontab -e
И добавляем:
0 0 * * * /bin/find /tmp -mtime +14 -exec rm {} ;
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.
Каждый пользователь желает быстро и без особых затруднений находить требуемую информацию. Существует большое количество типов файловых менеджеров, которые имеют отличную функциональность. Одним из самых лучших является терминал Linux. Он отличается высокой эффективностью и хорошей гибкостью.
С помощью терминала Linux можно без особого труда найти требуемые файлы не только по имени, но и по дате их обновления. Для поиска еще можно указать содержимое и различные регулярные выражения. Терминалом очень удобно пользоваться, так как с найденными данными сразу же можно осуществлять определенные действия.
Содержание
- 1 Синтаксис
- 1.1 Примеры
- 1.1.1 Список папок и файлов директории
- 1.1.2 Искать в домашнем каталоге пользователя
- 1.1.3 Дата модификации
- 1.1.4 Поиск файла в директории с помощью критерия «по имени»
- 1.1.5 Поиск файлов определённого размера
- 1.1.6 Поиск файлов определённом диапазоне размеров
- 1.1.7 Действие
- 1.1.8 Поиск документов в нескольких директориях
- 1.1.9 Без учета регистра, используя критерий «по имени»
- 1.1.10 Поиск файлов, которые отличаются от упомянутых
- 1.1.11 По большому количеству критериев
- 1.1.12 Использование оператора
- 1.1.13 Права доступа
- 1.1.14 Ищем все скрытые файлы
- 1.1.15 Поиск всех файлов группы
- 1.1 Примеры
Синтаксис
«find»- это одна из самых популярных и особенно важных утилит, которая устанавливается в операционной системе Линукс. Такая команда дает возможность быстро находить различные файлы и каталоги путем использования специальных условий. Она ищет требуемые данные по разрешению, собственнику, группе, объему, типу и иным условиям.
Данная утилита установлена «по умолчанию» в каждом дистрибутиве ОС Linux. Пользователю нет необходимости монтировать на ПК какие-либо дополнительные пакеты. Такая особенность позволяет максимально эффективно пользоваться командными строками.
Рассмотрим синтаксис:
find [директория] [опции][критерии поиска](операторы) [действия]
Здесь:
- Директория. Это путь, где поиск ищет требуемую информацию.
- Опции. Здесь можно ввести дополнительные аргументы, а также настроить глубину.
- Критерий. Перед поиском требуется определиться с критерием, с помощью которого будут найдены данные. К критериям относится имя файла, дата его создания, владелец, права и многое другое.
- Операторы. Используются для объединения критериев поиска.
- Действия. Устанавливаются предварительно. С их помощью отбираются нужные файлы.
Основные опции:
- -L — опция указывает, что нужно переходить по символическим ссылкам.
- -P — указывает, что по символическим ссылкам не переходить.
- -depth или -d — искать в директории в которой находишься, а также в подкаталогах.
- -print — выводить на экран полные имена документов.
- -type d — опция type показывает какой тип искать, буква d указывает на каталоги.
- —type f — буква f указывает на поиск файлов.
- -version — информация о версии утилиты.
Основные критерии:
- -size — размер.
- -name — искать по имени.
- -group — искать по группе.
- -nogroup — файлы, которые не относятся ни к одной группе.
- -mtime — поиск по дате изменения документа.
- -atime — искать по дате чтения.
- -user — владелец документа.
ВАЖНО! Критерии можно объединять используя операторы.
Операторы:
- -and — и.
- -or — или.
- -not — отрицание.
Действия:
- -exec команда ; — запустить команду
- -ls — выполнить ls.
Примеры
Утилита, которая имеется практически во всех версиях Линукс, дает возможность быстро найти требуемую информацию. Для этих целей предварительно вводятся критерии поиска. Пользоваться командой можно по-разному, так как у нее много опций. Рассмотрим примеры.
Список папок и файлов директории
Чтобы вывести все списки файлов, потребуется набрать название команды без параметров.
find
Имеется и альтернативный вариант – «find .».
Для обнаружения файлов в конкретной директории требуется в терминале набрать название утилиты и путь. Например /var/log
find /var/log
Искать в домашнем каталоге пользователя
Чтобы найти именно те файлы, которые относятся к определённому пользователю, нужно ввести команду
find. -user file
Дата модификации
Чтобы найти документы по дате, необходимо использовать критерии «mtime, atime».
- mtime — модификация.
- atime — чтение.
Найдем все файлы в каталоге /home, которые открывались 120 дней назад.
find /home -atime 120
Почти тоже самое будет, если нужно найти документы, которые изменялись 120 дней назад.
find /home -mtime 120
Поиск файла в директории с помощью критерия «по имени»
Чтобы найти файл по имени в требуемой директории необходимо использовать опцию «-name».
find /var/log -name "test.log"
Она в считанные секунды найдет файл «test.log». Одновременно с этим, будут показаны все данные, имеющие расширение «.log».
Поиск файлов определённого размера
Если требуется найти файл, размер которого известен пользователю, вводится -size с указанием размера.
find / -size -12M.
Поиск файлов определённом диапазоне размеров
Если пользователь знает ориентировочный размер документа, критерий также можно указать во время поиска.
find / -size +12M -size -25M
Действие
Выполним команду ls в каталоге run, для документов, которые изменялись 150 дней назад. Будем использовать действие «ls».
find /run -mtime 150 -type f -ls
Запустим утилиту ls, в каталоге home, для файлов больше 5000 байт.
find /home -size +5000c -type f -exec cat;
Поиск документов в нескольких директориях
Чтобы выполнить такой поиск, необходимо вводить пути директорий через пробел. Например /var /home.
find /var /home -name "file.txt"
Она дает возможность найти файл с именем «file.txt» в директориях формата «/var» и «/home».
Без учета регистра, используя критерий «по имени»
Найдем документ test.txt без учета регистра в каталоге /home. Для этого, будем использовать «iname».
find /home -iname "test.txt"
В итоге на экране вашего монитора появятся файлы, имеющие название «test.txt». Их может быть более двух.
Поиск файлов, которые отличаются от упомянутых
Зачастую пользователю нужно найти определенные данные, которые отличаются от определённого типа файлов. Для этих целей необходимо использовать оператор «-not» для отрицания.
find /root -not -name "*.txt"
По большому количеству критериев
Во время установки параметров поиска можно вводить несколько признаков. К примеру, если требуется найти файлы, имеющие расширение «.txt» и «.html», нужно ввести команду
$ find /var -regex ".*.(txt|html)$"
Использование оператора
Допускается одновременное совмещение нескольких критериев. Система обнаружит информацию, которая будет удовлетворять одному из условий. Для этих целей потребуется использование одного из операторов or (или), and (и), not (отрицание не).
find /var/log/exim4 -name "*.txt" -оr -name "test*"
Права доступа
Чтобы найти документ с определенными правами, используется критерий поиск -perm.
find /var/log -type f -perm 777
Почти тоже самое будет для папок с правами 777.
find /var/log -type d -perm 777
Поиск документов, у которых есть право на исполнение.
find /var/log -type f -perm /a=x
Найдем файлы в каталоге run, у которых есть право читать.
find /run -perm /u=r
Ищем все скрытые файлы
Для обнаружения скрытых файлов в директории необходимо ввести:
find /etc -type f name ".*"
Поиск всех файлов группы
Чтобы найти файлы, которые относятся к определённой группе, необходимо указать аргумент «group».
find /run -group apache
Существует множество способов применения find. Выше описаны лишь некоторые примеры, которые демонстрируют широкую функциональность утилиты.
Команда find — невероятно мощный инструмент, и его изучение может здорово вас выручить. Данные знания помогут вам эффективно выполнять различные задачи системного администрирования, такие как управление дисковым пространством, рекурсивные файловые операции и резервное копирование.
Команда поиска в Linux (find
) выполняет поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска. Синтаксис команды find
такой:
$ find directory-to-search criteria action
где:
- directory-to-search (каталог для поиска) — это отправная точка, с которой find начинает поиск файлов. Поиск включает все подкаталоги этого каталога.
- criteria (критерий или тест ) — сообщает, какие файлы искать
- action (действие) сообщает, что делать с каждым найденным файлом, соответствующим критериям.
Теперь давайте посмотрим на несколько примеров использования команды find в Linux, которые помогут вам в быстром изучении данной утилиты.
Поиск по названию (-name)
Вот простой пример. Следующая команда ищет файл a.txt
в текущем каталоге:
$ find . -name "a.txt"
./a.txt
где:
- . (точка) — означает что файл относится к текущему каталогу
- —name — указывает критерии, которые должны быть сопоставлены. В данном случае название файла
В данном примере критерий -name
учитывает регистр и игнорирует файл A.txt
. Чтобы гарантировать, что ваш поиск нечувствителен к регистру, используйте -iname
:
$ find . -iname "a.txt"
./a.txt
./A.txt
Чтобы найти все .jpg файлы изображений в текущем каталоге, используйте шаблон подстановки *.jpg
:
$ find . -name "*.jpg"
./genxfacebook2.jpg
./genxfacebook1.jpg
./Moodle2.jpg
./moodle.jpg
./moodle/moodle1.jpg
./genxfacebook.jpg
Вы можете использовать имя каталога для поиска. Например, чтобы найти все изображения в формате .jpg в каталоге /home:
$ find /home -name "*.jpg"
find: `/home/ubuntu/.ssh': Permission denied
/home/vagrant/Moodle2.jpg
/home/vagrant/moodle.jpg
/home/me/hello.jpg
find: `/home/me/testfiles': Permission denied
find: `/home/me/data': Permission denied
/home/me/water.jpg
find: `/home/me/.cache': Permission denied
Если вы видите слишком много ошибок, связанных с отказом в разрешениях (Permission denied), вы можете добавить опцию 2> /dev/null
в конце команды. Она перенаправляет сообщения об ошибках на устройство /dev/null и дает более чистый вывод:
find /home -name "*.jpg" 2>/dev/null
/home/vagrant/Moodle2.jpg
/home/vagrant/moodle.jpg
/home/me/hello.jpg
/home/me/water.jpg
Поиск по типу файла
С помощью критерия -type
вы можете искать файлы по типу. Типы файлов могут быть:
- f — простой файл
- d — директория
- l — символические ссылки
- b — блочные устройства (dev)
- c — символьные устройства (dev)
- p — именованные каналы
- s — сокеты
Например, при использовании -type d
будут перечислены только каталоги:
$ find . -type d
.
./.ssh
./.cache
./moodle
Поиск по размеру файла
Возможно, вам потребуется найти большие файлы и удалить их. В следующем примере за критерием размера файла следует строка +1G
. Это приведет к поиску всех файлов размером более 1 ГБ.
$ find . -size +1G
./Microsoft_Office_16.29.19090802_Installer.pkg
./android-studio-ide-183.5692245-mac.dmg
Знак + означает поиск файлов, размер которых превышает указанное ниже число. Знак минус (-) может использоваться для обозначения меньшего чем. Отсутствие знака означает точное совпадение размера.
Символ | Единица измерения |
с | Байт |
k | Килобайт |
M | Мегабайт |
G | Гигабайт |
Поиск пустых каталогов и файлов
Используйте критерий -empty
чтобы найти пустые каталоги и файлы:
$ find . -empty
./.cloud-locale-test.skip
./datafiles
./b.txt
...
./.cache/motd.legal-displayed
Поиск по времени изменения файла
Вы можете искать все файлы и каталоги в зависимости от времени создания или изменения с помощью опции -cmint
. Для поиска всех файлов, измененных за последние 60 минут (менее 60), используйте -60
:
$ find . -cmin -60
.
./a.txt
./datafiles
Для файлов, измененных в любое время до последних 60 минут, используйте +60
.
Поиск по времени доступа
Вы можете искать файлы по времени последнего доступа с помощью опции -atime
. Например, следующая команда ищет файлы, к которым не обращались в течение последних 180 дней:
$ find . -atime +180
Их можно переместить на устройство резервного копирования, если на диске не хватает места.
Поиск по имени пользователя
С помощью опции -user username
вы можете искать все файлы и каталоги, принадлежащие пользователю. Например, следующая команда ищет все файлы и каталоги, принадлежащие пользователю ubuntu, в каталоге /home:
$ find /home -user ubuntu 2>/dev/null
/home/ubuntu
/home/ubuntu/.bash_logout
/home/ubuntu/.bashrc
/home/ubuntu/.ssh
/home/ubuntu/.profile
Поиск по режиму
Хотите искать файлы, настроенные для определенного режима, то есть иметь определенный набор разрешений? Используют критерий -perm
. В следующем примере выполняется поиск файлов с разрешениями 777:
$ find /home -perm 777
Операторы
Для объединения нескольких тестов в одну команду поиска можно использовать следующие три логических оператора:
- -and
- -or
- -not
Например, следующая команда ищет файлы размером более 100 МБ, принадлежащие пользователю me:
$ find /home -user me -and -size +100M 2>/dev/null
/home/me/kali-linux-2020.3-installer-netinst-i386.iso
Следующая команда ищет файлы размером более 100 МБ, принадлежащие пользователю me или пользователю vagrant:
$ find /home ( -user vagrant -or -user me ) -and -size +100M 2>/dev/null
/home/vagrant/LibreOffice_7.0.1_Linux_x86-64_deb.tar.gz
/home/me/kali-linux-2020.3-installer-netinst-i386.iso
Вам нужно поместить символ обратной косой черты перед круглыми скобками, чтобы оболочка не пыталась их интерпретировать.
Действия
Команда find дает вам результаты поиска, а затем возможность выполнить действия над ними. Вот несколько предопределенных действий:
Действие | Описание |
-delete | Удаляет файлы, соответствующие критериям поиска |
-ls | Показывает подробный вывод ls с размерами файлов и количеством inode |
Показывает полный путь к соответствующим файлам. Это действие по умолчанию, если не указано другое действие. | |
-exec | Выполняет следующую команду в каждой строке результатов поиска. |
Итак, если вы хотите найти все пустые файлы и удалить их, вы можете сделать это следующим образом:
$ find . -empty -delete
Внимание: перед использованием действия удаления всегда можно безопасно запустить команду один раз с действием -print
и подтвердить результаты.
Действие -exec
является особенным. Это позволяет вам выполнить команду по вашему выбору в результатах поиска:
-exec command {} ;
где:
- command — это команда, которую вы хотите выполнить для результатов поиска, например rm, mv или cp.
- {} представляет результаты поиска.
- Команда заканчивается точкой с запятой после обратной косой черты.
Итак, команду поиска и удаления всех пустых файлов можно записать так:
$ find . -empty -exec rm {} ;
Вот еще один пример использования действия -exec
. Следующая команда копирует все .png изображения в каталог backup/images:
$ find . -name "*.png" -exec cp {} /backups/images ;
Заключение
Вы можете использовать команду find для поиска файлов по имени, дате последнего доступа, дате последнего изменения, имени пользователя (владельца), имени группы, размеру, разрешениям и другим критериям. С помощью этих результатов поиска вы можете выполнять над ними действия, такие как удаление, копирование или перемещение в другое место.
Также рекомендуем прочитать:
- 8 команд Linux при использовании которых, нужно соблюдать осторожность
- 5 лучших дистрибутивов Linux для ноутбуков-8
- Самые легкие дистрибутивы Linux. Топ-10 для старых компьютеров
- 10 наиболее часто задаваемых вопросов о Linux