Linux как найти файл по ссылке

Очень важно уметь вовремя найти нужную информацию в системе. Конечно, все современные файловые менеджеры предлагают отличные функции поиска, но им не сравнится с поиском в терминале 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.

Ищем файлы в Linux

Рассказываем, о том, как можно найти файл в Linux.

Ищем файлы через терминал

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

Вот основные опции, которые можно изменить, дополнив команду find:

  1. -name — название. Тут все очевидно. Если знаете точное название файла, то можно использовать этот аргумент и быстро добраться до искомого. Стоит отметить, что к имени относятся отдельные буквы — даже расширение файла по ним отдельно можно искать.
  2. -size — размер. Аргумент на тот случай, если хотите почистить чересчур большие файлы, занимающие много пространства в системе, или просто выяснить, сколько их на компьютере.
  3. -perm — права доступа. Поиск файлов, которые защищены конкретными правами доступа и требующие определенных привилегий для работы с ними.
  4. -user — пользователь. Эта опция нужна, если название файла неизвестно или вам нужно отобразить сразу несколько файлов, которые относятся к конкретному пользователю (он их создал, например, или загрузил в систему).
  5. -group — группа. Поиск файлов, которые относятся к определенной группе пользователей (например, если есть файлы, которые может редактировать и запускать только ряд пользователей системы).
  6. -mtime — поиск по времени, когда файл в последний раз изменяли. Аргумент на случай, если нужно отобразить список файлов, которые были изменены недавно.
  7. -type — тип. Поиск файлов определенного типа. Например, если вам нужны только папки или ссылки.

Также вы сами устанавливаете локацию поиска. Сразу после команды find нужно указать область системы, в которой нужно разыскать файл.

  • Можно указать директорию полностью. Например: /Downloads/Files.
  • Или искать в корневой директории и во всех вложенных в нее: /.
  • Можно искать в папке, где пользователь находится прямо сейчас: ./.
  • Ну и в домашней директории: ~.

Ищем по названию файла

Как я уже написал раньше, за название файла в Linux принимается все от первой буквы имени до расширения. Поэтому существует сразу несколько вариантов поиска по названию. Разберем их на нескольких примерах:

Используем для поиска имя

Начнем с поиска по конкретному названию. Команда для поиска файла с именем «hello» в домашней папке будет выглядеть так: find ~ -name «hello*» -print.

Вот такой простой синтаксис. Наглядно
Вот такой простой синтаксис. Наглядно

Тут стоит обратить внимание сразу на несколько деталей. Во-первых, название файла всегда пишется в двойных кавычках. По-другому поиск не заработает. Во-вторых, символ * (звездочка) сразу после названия файла. Она обозначается, что нужно искать только эту часть текста. Все, что идет дальше (расширение, например) будет игнорироваться. В-третьих, мы пишем __-print__в конце, чтобы вывести результат поиска в терминал и посмотреть, что за файлы мы нашли.

А вот и результаты поиска, полученные благодаря -print.
А вот и результаты поиска, полученные благодаря -print.

При этом вы можете указать при поиске название файла и расширение сразу. Это удобно, если у вас на компьютере есть несколько файлов с одинаковым названием, но разным расширением.

Так выглядит поиск конкретного файла
Так выглядит поиск конкретного файла

Используем для поиска расширение или часть имени

Теперь перейдем к поиску файла по расширению. Команда для поиска скриптов в формате .js в папке Downloads будет выглядеть так: find ~/Downloads/ -name «*js» -print.

Ставим звездочку перед расширением, чтобы исключить все лишнее из поисковой выдачи
Ставим звездочку перед расширением, чтобы исключить все лишнее из поисковой выдачи
Теперь в поисковой выдаче несколько файлов с одинаковым расширением
Теперь в поисковой выдаче несколько файлов с одинаковым расширением

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

Для примера покажу две команды:

  1. find ~/Downloads/ -name «[h]*» — print. Эта ищет все файлы, название которых начинается с буквы h.
  2. find ~/Downloads/ -name «[t]*» -print. А эта ищет файлы c расширением .js ,название которых начинается с буквы h.
Вот результаты поиска по букве
Вот результаты поиска по букве
Результаты поиска по букве и расширению
Результаты поиска по букве и расширению

Ищем по правам доступа

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

Права для редактирования, переноса и запуска файлов задаются с помощью кода из трех цифр. Эти же три цифры можно использовать в комбинации с командой find для поиска файлов, с которыми можно взаимодействовать только обладая заданными привилегиями.

Например, для поиска в домашней папке всех файлов, которые защищены привилегиями с кодом 775, можно воспользоваться такой командной: find ~ -perm 775 -print.

Поиск по пользователю

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

Например, вот так можно найти файл, принадлежащий пользователю parallels в папке Downloads: sudo find ~/Downloads -user parallels -print.

Вот как эта команда выглядит в терминале
Вот как эта команда выглядит в терминале

В результатах оказались все мои файлы и сама папка Downloads из домашней директории.

Поиск по группе

Более опытные пользователи Linux в курсе, что владельцем файлов и папок может быть не только конкретный человек, но и группа. Соответственно, можно искать все файлы, которые принадлежат отдельной группе. Работает это почти так же, как и в случае с пользователями, только опция другая — -group.

В итоге, чтобы найти в системе все файлы, принадлежащие участникам группы test, воспользуемся такой командой: find / -group test -print. Естественно, название выбрано для примера, и у вас вместо test может быть какое-то другое имя.

Ищем по типу файла

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

Например:

  • f — обычный тип. Это любой файл, который хранится на компьютере. При этом он состоит из блоков.
  • d — каталог. Это файлы-таблицы, содержащие некие ссылки на обычные файлы для иерархической организации. Звучит сложно? Это папки.
  • b — блочный тип. Это специальные файлы, которые ассоциируются с внешними магнитными дисками, где данные переносятся только кусками заданного размера.
  • с — символьный тип. Еще один специальный файл, который ассоциируется со всеми сущностями удаленного контроля типа терминалов.
  • p — именованный канал. Это очень сложная структура межпроцессного взаимодействия. В двух словах не описать.
  • l — ссылка. Это не совсем файл. Точнее, файл, конечно, но не содержащий в себе каких-то полезных данных. Ссылка — это путь до настоящего файла.
  • s — сокет. Это механизм взаимодействия между другими файлами и программами.

Символы перед каждым типом файлов указаны не просто так. Именно их мы будем использовать для поиска. Вот как может выглядеть команда для поиска обычного файла: find / -type f -print.

Как видите, количество файлов избыточное. Это говорит о том, что если мы хотим сыскать что-то конкретно, то фильтры надо настраивать более тонко
Как видите, количество файлов избыточное. Это говорит о том, что если мы хотим сыскать что-то конкретно, то фильтры надо настраивать более тонко

Собственно, мы задействовали саму команду поиска, указали в качестве локации поиска корневую директорию системы, использовали опцию -type для фильтрации результатов по типу и затем ввели сам тип f. Следуя такой же логике, можно указать другой символ (из перечисленных выше) и запустить поиск по другому типу.

Ищем по размеру файла

Файлы можно отфильтровать и отсортировать по размеру. Конечно, для точечного поиска эта опция вряд ли подойдет. Сами посудите, размер скольких файлов в системе вы вообще помните? Тем не менее, если вы по какой-то причине знаете точный размер, то его можно использовать в качестве фильтра для поиска. Например, чтобы найти в папке Downloads найти файл размером 100 мегабайт, нужно ввести find /home/имя пользователя/Downloads -size 100M -print.

Иногда вывод этой команды занимает весьма приличное время на полное отображение. Да и то помещается в терминал не полностью
Иногда вывод этой команды занимает весьма приличное время на полное отображение. Да и то помещается в терминал не полностью

Куда полезнее эта опция будет в том случае, если вам нужно отфильтровать файлы по размеру, а не сыскать что-то конкретное. Допустим, у вас на компьютере лежит массивный список тяжелых файлов, которые отнимают значимый объем пространства, а вы хотите провести некий аудит и чистку, чтобы это пространство хотя бы немного освободить. Например, для того чтобы найти все файлы в компьютере, которые весят больше 5 гигабайт, можно воспользоваться такой командой: find / -size +5000M -print.

Предупреждаю, количество файлов может быть внушительным — процесс их отображения в терминале наверняка затянется. Список будет по-настоящему огромным, поэтому лучше настраивать максимально узкие возможные фильтры.

Поиск по дате изменения файла

По названию этой опции понятно, что она ищет те файлы, которые редактировались за какой-то период времени. В частности, речь идет о количество дней от даты поиска (то есть момент, когда мы вводим команду). Например, если надо в домашней папке найти файлы и папки, которые подвергались каким-либо изменениям в последние 10 дней, то нужно ввести в терминал команду find ~ -mtime –10 -print

Другие команды для поиска

grep

Обычно эту команду используют, чтобы отфильтровать вывод других команд или для поиска информации в существующих документах.

Но если воспользоваться опцией -r, а в качестве локации поиска задать путь до папки, то grep разыщет файлы с указанным ранее названием.

Вот так, например: sudo grep -r «hello.js» ~.

whereis

Еще есть такая команда. У нее нет никаких опций и дополнений. Все, на что способна whereis — поиск расположения программ в системе. И работает она крайне топорно. Вводим команду, а следом за ней название программы, которую нужно отыскать. В ответ получим полный путь до исполняемого файла.

Ищем файлы, используя графический интерфейс

Изощрения с терминалом нужны в том случае, если вы специалист, и вам нужны максимально гибкие инструменты для поиска файлов. Простым смертным же в большинстве случае хватит и того поиска, что есть в графической среде операционной системы.

Поиск через меню оболочки

В Gnome 3 поиск прячется в меню Activities.

  • Кликаем по строчке Activities в верхнем левом углу над панелью избранных программ.
В последней версии Gnome это меню всегда закреплено в левой части панели инструментов
В последней версии Gnome это меню всегда закреплено в левой части панели инструментов
  • Затем нажимаем на поисковое поле, расположенное по центру в верхней части интерфейса.
Вот встроенный в систему поисковик
Вот встроенный в систему поисковик
  • Вводим поисковой запрос.
Как видите, Ubuntu ищет не только по локальным ресурсам, но и в интернете. Это делает его отчасти полезнее поиска в терминале
Как видите, Ubuntu ищет не только по локальным ресурсам, но и в интернете. Это делает его отчасти полезнее поиска в терминале
  • Кликаем по найденному файлу, чтобы он тут же открылся.
Файл открывается в подходящей программе, а не в файловом менеджере
Файл открывается в подходящей программе, а не в файловом менеджере

Если манипуляции мышкой вам чужды (вы же все-таки пользователь Linux), то можно обойтись и без нее. Для включения меню Activities нажмите на клавиатуре клавишу Win (Cmd на клавиатурах Apple). Чтобы начать поиск, просто начните вводить свой запрос (ничего выделять не нужно). А для выбора файла из выдачи просто нажмите на клавишу «Ввод» (Enter).

Ищем через файловый менеджер

  • Открываем любой файловый менеджер (в моем примере будет стандартный Nautilus). См. также: лучшие файловые менеджеры для Linux.
У вас может быть любой другой файловым менеджер
У вас может быть любой другой файловым менеджер
  • Ищем там кнопку включения поиска. Обычно она похожа на лупу. Это общепризнанный символ.
Иногда поле поиска отображается в виде строки
Иногда поле поиска отображается в виде строки
  • Вводим свой поисковой запрос и выбираем нужный объект.
Имеем схожий результат
Имеем схожий результат

Итак, мы рассмотрели с вами все способы поиска файлов в Linux-системах. А если вы только собираетесь познакомиться с этой ОС – рекомендуем изучить популярные дистрибутивы Linux и выбрать самый подходящий.

Автор материала: Владимир Ковылов

Ищем файлы в Linux

Подписывайтесь на наш канал и ставьте лайки! А еще можете посетить наш официальный сайт.

Обновлено Обновлено: 01.02.2022
Опубликовано Опубликовано: 25.07.2016

Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.

Синтаксис
Примеры
    Поиск по имени
    По дате
    По типу файла
    По правам
    По содержимому
    С сортировкой по дате изменения
    Лимиты
    Действия над найденными объектами
Запуск по расписанию в CRON

Общий синтаксис

find <где искать> <опции>

<где искать> — путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».

<опции> — набор правил, по которым выполнять поиск.

* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.

Описание опций

Опция Описание
-name Поиск по имени.
-iname Регистронезависимый поиск по имени.
-type

Тип объекта поиска. Возможные варианты:

  • f — файл;
  • d — каталог;
  • l — ссылка;
  • p — pipe;
  • s — сокет.
-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
-print Показать найденное.
-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 системах он может располагаться в разных местах.

Команда find в Linux – Это команда для поиска файлов и каталогов на основе специальных условий. Find – это одна из наиболее важных и часто используемых утилит системы Linux.

Оглавление

  • 1 Основная информация о Find
  • 2 Основные параметры команды find
  • 3 Синтаксис и параметры команды Find
    • 3.1 Путь
    • 3.2 Опции
      • 3.2.1 2.1.1. Опция -name
      • 3.2.2 2.1.2. Опция -perm
      • 3.2.3 2.1.3. Опция -prune
      • 3.2.4 2.1.4. Опции -user и —nouser
      • 3.2.5 2.1.5. Опции -group и -nogroup
      • 3.2.6 2.1.6. Опция -mtime
      • 3.2.7 2.1.7. Опция -newer
      • 3.2.8 2.1.8. Опция -type
      • 3.2.9 2.1.9. Опция -size
      • 3.2.10 2.1.10. Опция Опция -depth
      • 3.2.11 2.1.11. Опция -mount
    • 3.3 Критерии поиска
      • 3.3.1 Примеры использования команды find с использованием критериев
    • 3.4 Операторы
      • 3.4.1 Примеры использования команды find с использованием операторов
    • 3.5 Действия над файлами
      • 3.5.1 Примеры использования команды find с использованием действий
    • 3.6 Примеры использования find с параметром exec
  • 4 Пример использования команды find
    • 4.1 1)Выведите списки всех файлов текущей директории и ее подкаталогов
    • 4.2 2)Найдите все файлы и директории в вашей текущей рабочей директории
    • 4.3 3)Выведите список всех файлов определенной директории
    • 4.4 4)Найдите файл по имени в директории
    • 4.5 5)Найдите файл во множестве директорий
    • 4.6 6)Найдите файл по имени без учета регистра
    • 4.7 7)Найдите все типы файлов отличные от упомянутого
    • 4.8 8)Найдите файлы по множеству признаков
    • 4.9 9)Найдите файлы с использованием условия OR
  • 5 Заключение

Find – это одна из наиболее важных и часто используемых утилит системы Linux. Это команда для поиска файлов и каталогов на основе специальных условий. Ее можно использовать в различных обстоятельствах, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим подобным критериям.

Утилита предустановлена по умолчанию во всех Linux дистрибутивах, поэтому вам не нужно будет устанавливать никаких дополнительных пакетов. Это очень важная находка для тех, кто хочет использовать командную строку наиболее эффективно.

Команда find имеет такой синтаксис:

find [папка] [параметры]критерийшаблон [действие]

Папка– каталог в котором будем искать

Параметры– дополнительные параметры, например, глубина поиска, и т д

Критерий– по какому критерию будем искать: имя, дата создания, права, владелец и т д.

Шаблон – непосредственно значение по которому будем отбирать файлы.

Основные параметры команды find

Я не буду перечислять здесь все параметры, рассмотрим только самые полезные.

  • -P никогда не открывать символические ссылки
  • -L – получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл.
  • -maxdepth – максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1.
  • -depth – искать сначала в текущем каталоге, а потом в подкаталогах
  • -mount искать файлы только в этой файловой системе.
  • -version – показать версию утилиты find
  • -print – выводить полные имена файлов
  • -type f – искать только файлы
  • -type d – поиск папки в Linux

Синтаксис и параметры команды Find

  • /v – Выводит все строки, не содержащие строку, заданную параметром строка.
  • /c – Подсчет строк, содержащих строку, указанную параметром строка, и отображение общего количества.
  • /n – Выводит номера строк перед самими строками.
  • /i – Задает поиск без различия строчных и заглавных букв.
  • “строка_поиска” – Обязательный параметр. Указывает группу символов, поиск которой будет производиться. Необходимо заключить параметр строка в кавычки (“строка”).
  • [диск:][путь] ИмяФайла – Задает местоположение и имя файла, в котором будет производиться поиск заданной строки символов.
  • /? – Отображение справки в командной строке.

Путь

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

Опции

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

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

2.1.1. Опция -name

При работе с командой find чаще всего используется опция -name. После нее в кавычках должен быть указан шаблон имени файла.
Если необходимо найти все файлы с расширением .txt в вашем начальном каталоге, укажите символ в качестве путевого имени. Имя начального каталога будет извлечено из переменной $HOME.

$ find ~ -name «*.txt» -print

Чтобы найти все файлы с расширением .txt, находящиеся в текущем каталоге, следует воспользоваться такой командой:

$ find . -name «*.txt» -print

Для нахождения в текущем каталоге всех файлов, в именах которых встречается хотя бы один символ в верхнем регистре, введите следующую команду:

$ find . -name «[A-Z]*» -print

Найти в каталоге /etc файлы, имена которых начинаются с символов «host«, позволяет команда

$ find /etc -name «hoat*» -print

Поиск в начальном каталоге всех файлов с расширением .txt, а также файлов, имена которых начинаются с точки, производит команда

$ find ~ -name «*.txt» -print -о -name «.*» -print

Опция -о является обозначением операции логического ИЛИ. В случае ее применения помимо файлов с обычными именами будут найдены файлы, имена которых начинаются с точки.

Если вы хотите получить список всех файлов в системе, не имеющих расширения, выполните представленную ниже команду, но будьте осторожны, так как она может существенно замедлить работу системы:

$ find / -name «*» -print

Ниже показано, как найти все файлы, в именах которых сначала следуют символы нижнего регистра, а за ними — две цифры и расширение .txt (например, ах37.xt):

$ find . -name » [а-х] [а-х] [0—9] [0—9] . txt» -print

2.1.2. Опция -perm

Опция -perm позволяет находить файлы с заданным режимом доступа. Например, для поиска файлов с режимом доступа 755 (их может просматривать и выполнять любой пользователь, но только владелец имеет право осуществлять запись) следует воспользоваться такой командой:

$ find . -perm 755 -print

Если перед значением режима вставить дефис, будет произведен поиск файлов, для которых установлены все указанные биты разрешений, остальные биты при этом игнорируются. Например, следующая команда ищет файлы, к которым другие пользователи имеют полный доступ:

$ find . -perm -007 -print

Если же перед значением режима введен знак «плюс», осуществляется поиск файлов, для которых установлен хотя бы один из указанных битов разрешений, при этом остальные биты игнорируются.

2.1.3. Опция -prune

Когда вы не хотите вести поиск в том или ином каталоге, воспользуйтесь опцией -prune. Она служит указанием остановить поиск на текущем путевом имени. Если путевое имя указывает на каталог, команда find не будет заходить в него. При наличии опции -depth опция -prune игнорируется.

Следующая команда проводит поиск в текущем каталоге, не заходя в подкаталог /bin:

$ find . -name «bin» -prune -о -print

2.1.4. Опции -user и —nouser

Чтобы найти файлы, принадлежащие определенному пользователю, укажите в команде find опцию -user, а также имя пользователя. Например, поиск в начальном каталоге файлов, принадлежащих пользователю dave, осуществляется посредством такой команды:

$ find ~ -user dave -print

Поиск в каталоге /etc файлов, принадлежащих пользователю uucp, выполняет следующая команда:

$ find /etc -uaer uucp -print

Благодаря опции -nouser возможен поиск файлов, принадлежащих несуществующим пользователям. При ее использовании производится поиск файлов, для владельцев которых нет записи в файле /etc/passwd. Конкретное имя пользователя указывать не нужно: команда find выполняет всю необходимую работу сама. Чтобы найти все файлы, которые принадлежат несуществующим пользователям и находятся в каталоге /home, задайте вот такую команду:

$ find /home -nouaer -print

2.1.5. Опции -group и -nogroup

Опции -group и -nogroup аналогичны опциям -user-nouser/apps всех файлов, которыми владеют пользователи группы accts:

$ find /арра -group accta -print

Следующая команда ищет во всей системе файлы, принадлежащие несуществующим группам:

$ find / -nogroup -print

2.1.6. Опция -mtime

Опцию -mtime следует применять при поиске файлов, доступ к которым осуществлялся х дней назад. Если аргумент опции снабдить знаком ‘-‘, будут отобраны файлы, к которым не было доступа в течение х дней. Аргумент со знаком ‘+’ приводит к противоположному результату — производится отбор файлов, доступ к которым осуществлялся на протяжении последних х дней.

Найти все файлы, которые не обновлялись в течение последних пяти дней, позволяет следующая команда:

$ find / -mtime -5 -print

Ниже приведена команда, выполняющая поиск в каталоге /var/adm файлов, которые обновлялись в течение последних трех дней:

$ find /var/adm -mtime +3 -print

2.1.7. Опция -newer

Если необходимо найти файлы, доступ к которым осуществлялся в промежутке времени между обновлениями двух заданных файлов, воспользуйтесь опцией -newer. Общий формат ее применения таков:

-newer старый_файл ! -newer новый_файл

Знак ‘!‘ является оператором логического отрицания. Он означает: найти файлы, которые новее, чем старый_файл, но старее, чем новый_файл.

Предположим, у нас есть два файла, которые обновлялись с интервалом немногим более двух дней:

-rwxr-xr-x 1 root    root    92 Apr 18 11:18 age.awk
-rwxrwxr-x 1 root    root    1054 Apr 20 19:37 belts.awk

Для нахождения всех файлов, которые обновлялись позже, чем age.awk, но раньше, чем belts.awk, выполните следующую команду (применение опции -exec описано чуть ниже):

$ find . -newer age.awk ! -newer belts.awk -exec Is -1 {} ;
-rwxrwxr-x 1 root    root    62 Apr 18 11:32 ./who.awk
-rwxrwxr-x 1 root    root    49 Apr 18 12:05 ./group.awk
-rw-r—r— 1 root    root    201 Apr 20 19:30 ./grade2.txt
-rwxrwxr-x 1 root    root    1054 Apr 20 19:37 ./belts.awk

Но как быть, если необходимо найти файлы, созданные, скажем, в течение последних двух часов, а у вас нет файла, сформированного ровно два часа назад, с которым можно было бы сравнивать? Создайте такой файл! Для этой цели предназначена команда touch -t, которая создает файл с заданной временной меткой в формате ММДЦччмм (месяц-день-часы-минуты). Например:

$ touch -t 05042140 dstamp
$ ls -1 dstamp
-rw-r—r— 1 dave    admin    0 May 4 21:40 dstamp

В результате будет получен файл, дата создания которого — 4 мая, время создания —21:40 (предполагается, что текущее время — 23:40). Теперь можно применить команду find с опцией -newer для нахождения всех файлов, которые обновлялись в течение последних двух часов:

$ find . -newer datamp -print

2.1.8. Опция -type

Операционные системы UNIX и Linux поддерживают различные типы файлов. Поиск файлов нужного типа осуществляется посредством команды, find с опцией -type. Например, для нахождения всех подкаталогов в каталоге /etc воспользуйтесь такой командой:

$ find /etc -type d -print

Чтобы получить список всех файлов, но не каталогов, выполните следующую команду:

$ find . ! -type d -print

Ниже приведена команда, которая предназначена для поиска всех символических ссылок в каталоге /etc.

$ find /etc -type 1 -print

2.1.9. Опция -size

В процессе поиска размер файла указывается с помощью опции -size N, где N — размер файла в блоках по 512 байтов. Возможные аргументы имеют следующие значения: +N — поиск файлов, размер которых больше заданного, -N — меньше заданного, N — равен заданному. Если в аргументе дополнительно указан символ с, то размер считается заданным в байтах, а не в блоках, а если символ k — в килобайтах. Для поиска файлов, размер которых превышает 1 Мб, предназначена команда

$ find . -aize -flOOOk -print

Следующая команда выполняет поиск в каталоге /home/apache файлов, размер которых в точности равен 100 байтам:

$ find /home/apache -sixe 100с -print

Произвести поиск файлов, размер которых превышает 10 блоков (5120 байтов), позволяет приведенная ниже команда:

$ find . -size +10 -print

2.1.10. Опция Опция -depth

Опция -depth позволяет организовать поиск таким образом, что сначала проверяются все файлы текущего каталога (и рекурсивно все его подкаталоги) и только в конце — запись самого каталога. Эта опция широко применяется при создании списка файлов, помещаемых в архив на магнитной ленте с помощью команды cpio или tar, так как в этом случае сначала записывается на ленту образ каталога и лишь после этого задаются права доступа к нему. Это позволяет пользователю архивировать те каталоги, для которых у него нет разрешения на запись.
Следующая команда выводит список всех файлов и подкаталогов текущего каталога:

$ find . -name «*» -print -о -name «.*» -print -depth

Вот как могут выглядеть результаты ее работы:

./.Xdefaults ./.bash_logout ./.bash_profile ./.bashrc ./.bash_nistory ./file ./Dir/filel ./Dir/file2 ./Dir/file3 ./Dir/Subdir/file4 ./Dir/Subdir ./Dir

2.1.11. Опция -mount

Поиск файлов только в текущей файловой системе, исключая другие смонтированные файловые системы, обеспечивает опция -mount команды find. В следующем примере осуществляется поиск всех файлов с расширением .хс в текущем разделе диска:

$ find / -name «*.ХС» -mount -print

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

У команды 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 с использованием критериев

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

find . -type f -name “~*” -print

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

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

Операторы

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

Короткая форма оператораДлинная формаОписание

! критерий -not Отрицание (возвращает true, если критерийfalse)
критерий1-a критерий2 -and Оператор И (true, если критерий1 и критерий2true)
критерий1-o критерий2 -or Оператор ИЛИ (true, если критерий1 или критерий2true)

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

Примеры использования команды 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).

find . -name “~*” -type f -ok rm {} ;

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

Поиск файлов и удаление их при помощи параметра exec является часто встречающимся вариантом использования этого параметра, но вам не нужно использовать exec для этих целей, так как более удачный вариант будет описан позднее.

Поиск всех файлов с расширением .old и их удаление: find / -name “*.old” -exec /bin/rm {} ; Поиск всех файлов, размер которых превышает 100 МБ и их удаление: find / -size +100M -exec /bin/rm {} ; Бывают и такие случаи, что программы “сходят с ума” и заполняют директории тысячами мелких файлов, при этом вы не сможете просто использовать команду rm * по той причине, что командная оболочка не в состоянии заменить символ * на имена всех этих файлов, зато в состоянии удалить эти файлы по очереди: find . -exec /bin/rm {} ; Помните, что вы не должны использовать эти примеры, поскольку для удаления файлов у GNU find есть параметр -delete, более безопасный, нежели “-exec /bin/rm {};”. Пример использования: find / -name “*.old” -delete

В старых системах Unix у вас не будет возможности использовать параметр -delete, поэтому альтернатив параметру -exec для удаления файлов в них не остается.

А теперь рассмотрим некоторые другие примеры использования программы find с параметром exec.

Рекурсивное изменение прав доступа для файлов, не затрагивающее директории.find ./ -type f -exec chmod 644 {} ;

При помощи параметра -type f вы можете вести поиск только файлов и просто изменять права доступа к каждому из них при помощи chmod.

Рекурсивное изменение владельца файлов с olduser на newuserfind / -user olduser -type f -exec chown newuser {} ;

В этом примере я использовал параметр -user как альтернативу параметру -uid.

Рекурсивное изменение прав доступа для всех директорийfind . -type d -exec chmod 755 {} ;

В этом примере я снова использовал параметр -type, но на этот раз с аргументом d для поиска директорий.

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

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

find / -name config -print

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

1)Выведите списки всех файлов текущей директории и ее подкаталогов

Для того чтобы вывести списки всех файлов текущей директории и ее подкаталогов, мы можем использовать:

$ find

В качестве альтернативы, мы можем также использовать ‘find . ’, которая выдаст вам тот же результат.

2)Найдите все файлы и директории в вашей текущей рабочей директории

Если нужно найти только директории, то можно использовать:

$ find . -type d

Чтобы найти только файлы, а не директории:

$ find . -type f

3)Выведите список всех файлов определенной директории

Для того чтобы найти файлы из определенной директории надо ввести:

$ find /root

This command will look for all the files in /root directory.

4)Найдите файл по имени в директории

Для поиска файла по имени в определенной директории введите:

$ find /root -name “linuxtechi.txt”

Эта команда будет искать файл linuxtechi.txt в директории /root. Так же мы найти все файлы с расширением .txt:

$ find /root -name “*.txt”

5)Найдите файл во множестве директорий

Для поиска файлов во множестве директорий введите:

$ find /root /etc -name “linuxtechi.txt”

With this command, we can look for linuxtechi.txt file in /root & /etc directories.

С помощью этой команды мы можем найти файл linuxtechi.txt в директориях /root и /etc.

6)Найдите файл по имени без учета регистра

Ищите файлы без учета регистра с помощью -iname:

$ find /root -iname “Linuxtechi.txt”

В результате вы получите все файлы с названием linuxtechi.txt. При этом файлов может быть несколько, так как linuxtechi.txt будет равняться LINUXTECHI.txt .

7)Найдите все типы файлов отличные от упомянутого

Давайте предположим, что нам необходимо найти все файлы отличные от определенного типа файлов. Чтобы этого добиться вводим:

$ find /root -not -name “*.txt”

8)Найдите файлы по множеству признаков

Мы можем совмещать более чем одно условие при поиске файлов. Предположим, что нам нужны файлы с расширениями .txt и .html:

$ find . -regex “.*.(txt|html)$”

9)Найдите файлы с использованием условия OR

Так же мы можем совмещать несколько поисковых критериев, что приведет к поиску файлов на основе удовлетворения одному из условий. Делается это с помощью оператора OR:

$ find -name “*.txt” -o -name “linuxtechi*”

Заключение

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

[spoiler title=”Источники”]

  • https://losst.ru/komanda-find-v-linux
  • http://Cmd4Win.ru/administrirovanie-computera/upravlenie-failami/33-find
  • https://pingvinus.ru/note/command-find
  • https://rtfm.co.ua/komanda-find-i-eyo-opcii-v-primerax/
  • http://rus-linux.net/MyLDP/consol/exec-option-in-command-find.html
  • https://omgubuntu.ru/25-primierov-ispolzovaniia-komandy-find-dlia-nachinaiushchikh-znakomstvo-s-linux/

[/spoiler]

Время на прочтение
5 мин

Количество просмотров 122K

Иногда критически важно быстро найти нужный файл или информацию в системе. Порой можно ограничиться стандартами функциями поиска, которыми сейчас обладает любой файловый менеджер, но с возможностями терминала им не сравниться.

Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:

  • Дате добавления.
  • Содержимому.
  • Регулярным выражениям.

Данная команда будет очень полезна системным администраторам для:

  • Управления дисковым пространством.
  • Бэкапа.
  • Различных операций с файлами.

Команда find в Linux производит поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска.

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

$ find directory-to-search criteria action

Где:

  • directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
  • criteria (критерий) – критерий, по которым нужно искать файлы;
  • action (действие) – что делать с каждым найденным файлом, соответствующим критериям.

Поиск по имени

Следующая команда ищет файл s.txt в текущем каталоге:

$ find . -name "s.txt"
./s.txt

Где:

  • . (точка) – файл относится к нынешнему каталогу
  • -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.

В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.

$ find . -iname "s.txt"
./s.txt
./S.txt

Для поиска всех изображений c расширением .png нужно использовать шаблон подстановки *.png:

$ find . -name "*.png"
./babutafb.png
./babutafacebook.png
./Moodle2.png
./moodle.png
./moodle/moodle1.png
./genxfacebook.png

Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:

$ find /home -name "*.png"
find: `/home/babuta/.ssh': Permission denied
/home/vagrant/Moodle2.png
/home/vagrant/moodle.png
/home/tisha/hello.png
find: `/home/tisha/testfiles': Permission denied
find: `/home/tisha/data': Permission denied
/home/tisha/water.png
find: `/home/tisha/.cache': Permission denied

Если выдает слишком много ошибок в отказе разрешения, тогда можно добавить в конец команды – 2> /dev/null. Таким образом сообщения об ошибках будут перенаправляться по пути dev/null, что обеспечит более чистую выдачу.

find /home -name "*.jpg" 2>/dev/null
/home/vagrant/Moodle2.jpg
/home/vagrant/moodle.jpg
/home/tisha/hello.jpg
/home/tisha/water.jpg

Поиск по типу файла

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги:

$ find . -type d
.
./.ssh
./.cache
./moodle

Поиск по размеру файла

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

  • “+” — Поиск файлов больше заданного размера
  • “-” — Поиск файлов меньше заданного размера
  • Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.

В данном случае поиск выведет все файлы более 1 Гб (+1G).

$ find . -size +1G
./Microsoft_Office_16.29.19090802_Installer.pkg
./android-studio-ide-183.5692245-mac.dmg

Единицы измерения файлов:

  • c — Байт
  • k — Кбайт
  • M — Мбайт
  • G — Гбайт

Поиск пустых файлов и каталогов

Критерий -empty позволяет найти пустые файлы и каталоги.

$ find . -empty
./.cloud-locale-test.skip
./datafiles
./b.txt
...
./.cache/motd.legal-displayed

Поиск времени изменения

Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:

$ find . -cmin -60
.
./a.txt
./datafiles

Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).

Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.

$ find . -cmin +60

Поиск по времени доступа

Критерий -atime позволяет искать файлы по времени последнего доступа.

$ find . -atime +180

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

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

Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:

$ find /home -user tisha 2>/dev/null

Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

$ find /home -perm 777

Поиск файлов с разрешениями 777.

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

  • -and
  • -or
  • -not

Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:

$ find /home  -user tisha  -and  -size +1G  2>/dev/null

Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.

$ find /home ( -user pokeristo -or -user tisha )  -and  -size +1G  2>/dev/null

Перед скобками нужно поставить обратный слеш “”.

Действия

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

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска с:
    • Размерами файлов.
    • Количеством inode.
  • -print Стоит по умолчанию, если не указать другое действие. Показывает полный путь к найденным файлам.
  • -exec Выполняет указанную команду в каждой строке результатов поиска.

-delete

Полезен, когда необходимо найти и удалить все пустые файлы, например:

$ find . -empty -delete

Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

-exec:

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

-exec command {} ;

Где:

  • command – это команда, которую вы желаете выполнить для результатов поиска. Например:
    • rm
    • mv
    • cp
  • {} – является результатами поиска.
  • ; — Команда заканчивается точкой с запятой после обратного слеша.

С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:

$ find . -empty -exec rm {} ;

Другой пример использования действия -exec:

$ find . -name "*.jpg" -exec cp {} /backups/fotos ;

Таким образом можно скопировать все .jpg изображения в каталог backups/fotos

Заключение

Команду find можно использовать для поиска:

  • Файлов по имени.
  • Дате последнего доступа.
  • Дате последнего изменения.
  • Имени пользователя (владельца файла).
  • Имени группы.
  • Размеру.
  • Разрешению.
  • Другим критериям.

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

  • Удаление.
  • Копирование.
  • Перемещение в другой каталог.

Команда find может сильно облегчить жизнь системному администратору, а лучший способ овладеть ей – больше практиковаться.

image

Добавить комментарий