Управление и взаимодействие с операционной системой Линукс основано на командах. Сегодня есть и графические интерфейсы в различных дистрибутивах, но их использование не научит человека компьютерному мышлению и не разовьет память. Именно поэтому при переходе на любую Unix-подобную операционную систему, необходимо учиться писать запросы и команды в терминале.
Это значительно сокращает поиск нужных данных и выполнение расчетов. Одной из самых популярных команд является «find». Необходимо подробно рассмотреть, как осуществляется в Linux поиск файла с ее помощью.
Основные опции команды Linux find
Очень часто в процессе работы появляется необходимость найти тот или иной файл (папку). Часто даже название файла забываются, поэтому приходиться выполнять поиск по другим критериям: правам доступа, размеру, типа файла и его расширению. Специально для этих целей и придумана команда find. Она позволяет выполнять поиск файла или папки в Linux по имени, а также создавать различные запросы для файловой системы и жесткого диска для нахождения нужных данных. Преимуществом использования данной команды становится возможность не только выполнять поиск по всем каталогам, созданным в операционной системе, но в отдельных указанных папках.
Linux для начинающих / Урок #9 – Установка сторонних программ

Важно! Возможности команды достаточно обширны, как и список предлагаемых к использованию опций. В этом материале будут описаны лишь наиболее важные и популярные из них, так как для рассмотрения всех атрибутов и параметров, доступных к применению, потребует много времени.
Помимо поиска на внутренних носителях, find может спокойно искать данные по заданным параметрам на дисках типа NFS, но только в том случае, если пользователь обладает соответствующими разрешениями. В таких случаях обычно все выполняется на фоне, так как раскрытие дерева каталога занимает существенное количество времени.
Разница между locate и find Линукс
Многие новички часто спрашивают, почему в операционной системе Линукс есть две одинаковые команды: locate и find, ведь выполняют они одни и те же действия. Зачем использовать одну, если есть другая, и наоборот.
На самом деле, различия есть, и они весьма существенные. Цель команд одна – найти файл по заданным характеристикам или имени, а вот работают они по-разному. В случае с find поиск выполняется в реально существующей системе. Он более медленный, но его результаты всегда актуальны. К тому же, у find больше опций.
Команда locate делает все то же самое, но использует для поиска базу данных, которая была создана ранее (командой updatebd). Процедура нахождения файла или папки выполняется быстрее, но системе приходится пользоваться «старой» базой данных и искать имена или их части.

Для поиска по имени в Linux используют find name
Как найти все файлы только для чтения
Как уже было сказано, команда find более многофункциональна, чем locate. Она может выполнять поиск по операционной системе и жесткий дискам, руководствуюсь в качестве параметров и фильтров разрешениями, выданными конкретному пользователю (его учетной записи). Для этого используются специальные маски прав в восьмеричной и других системах исчисления. К примеру, для нахождения данных с маской прав 0664, необходимо выполнить команду «$find . type f -perm 0664» без кавычек (они добавлены для удобства отображения команд).
Для поиска файлов с установленными флагами suid/guid выполняют такую строку «$find / -perm 2644». А вот поиск файлов, которые доступны только для чтения, выглядит следующим образом: «$ find /etc -maxdepth 1 -perm /u=r».
Важно! Исполняемые файлы имеют такие же разрешения и по ним удобно проводить поиск. Пользуясь масками команды find, а не поиском по расширению. Для нахождения только исполняемых файлов прописывают и выполняют «$find /bin -maxdepth 2 -perm /a=x».
Найти файлы, к которым был получен доступ определённое время назад
Есть возможность также воспользоваться специальным атрибутом, позволяющим выполнять поисковые работы по файлам, которые были открыты или отредактированы последний раз определенное время назад. В качестве единицы измерения времени выступает «день», который добавляется в качестве значения к атрибуту –atime. Команда выглядит так: «find / -atime 34» и ищет данные, доступ к которым осуществлялся ровно 34 дня назад.
Сортировка результатов по времени
Если данных найдено слишком много и они расположены в списке немного не так, как нужно для того, чтобы поиск нужных файлов был комфортным, то есть возможность предварительно отсортировать результаты по времени. Для этого в команду добавляют параметр printf и пользуются программой sort. Выглядит это примерно так: «$ find /path/to/search -printf «%T+t%pn» | sort». Это будет упорядочивать данные от самых старых к самым новым. Чтобы поменять порядок добавляют ключ r: «$ find /path/to/search -printf «%T+t%pn» | sort r»
Найти файл на основе имени пользователя
В Linux найти файл по его владельцу или группе владельцев крайне просто. Для этого понадобится все та же команда. Для того чтобы искать все файлы с названием 1221.txt в корневом каталоге, принадлежащем пользователю с именем root, необходимо прописать «find / -user root -name 1221.txt».

Процедура использования locate мало чем отличается от find
Как отправить выход команде find в Linux
Проблема поиска через терминал состоит в том, что иногда файлов слишком много и выводится большой перечень результатов. Просмотреть их все порой не хватает сил. Вывод строки можно перенаправить tail или выводить результаты вы файл: «find / -name *.mp3 -fprint nameoffiletoprintto».
Простой пример использования команды find
Простой рекурсивный поиск документов и данных в операционной системе Линукс может осуществляться без каких-либо дополнительных параметров. К примеру, чтобы найти документ по имени config в корневой папке, необходимо прописать «find / -name config –print».
Фильтрация файлов по глубине
По глубине ищут в тех случаях, когда документы точно находятся в каталогах, которые «лежат» в других папках. К примеру, каждый каталог (а всего их путь будет три уровня) содержит 10 файлов и 10 других подпапок Для создания подобной структуры необходимо выполнить команды:
mkdir -p ~/test/level1dir/level2dir/level3dir
Далее можно искать по имени (find -name file1) или выполнить фильтрацию по глубине (find -maxdepth 2 -name file1).
Работа с найденными файлами
Для того чтобы выполнять действия над найденными документами применяется find exec Linux. Чтобы получить подробную информацию по каждому результату, выполняют «$find . -exec ls -ld <> ;». Для удаления все текстовых типов во временную папку прописывают «$find /tmp -type f -name «*.txt» -exec rm -f <> ;». А для того чтобы, к примеру, удалить все данные, больше 50 мегабайт в объеме, выполняют «$ find /home/bob/dir -type f -name *.log -size +5M -exec rm -f <> ;».

Применение опции exec
Теперь стало ясно, как найти файл или директорию в Линукс. Все крайне просто, ведь процедура основана на использовании команды find, которая выводит все содержимое результатов по определенным критериям. В сторонних справочниках к различным дистрибутивам можно почитать более подробное описание опций find, помогающей найти любую папку в Linux.
Источник: mirinfo.ru
Ищем файлы в Linux
В терминале Linux за поиск файлов, ссылок, папок и прочего отвечает команда find . Естественно, сама по себе она смысла не несет, и для поиска придется добавить ряд аргументов — название искомого файла, его тип и другие параметры, на которые можно ориентироваться в ходе поиска.
Вот основные опции, которые можно изменить, дополнив команду find :
- -name — название. Тут все очевидно. Если знаете точное название файла, то можно использовать этот аргумент и быстро добраться до искомого. Стоит отметить, что к имени относятся отдельные буквы — даже расширение файла по ним отдельно можно искать.
- -size — размер. Аргумент на тот случай, если хотите почистить чересчур большие файлы, занимающие много пространства в системе, или просто выяснить, сколько их на компьютере.
- -perm — права доступа. Поиск файлов, которые защищены конкретными правами доступа и требующие определенных привилегий для работы с ними.
- -user — пользователь. Эта опция нужна, если название файла неизвестно или вам нужно отобразить сразу несколько файлов, которые относятся к конкретному пользователю (он их создал, например, или загрузил в систему).
- -group — группа. Поиск файлов, которые относятся к определенной группе пользователей (например, если есть файлы, которые может редактировать и запускать только ряд пользователей системы).
- -mtime — поиск по времени, когда файл в последний раз изменяли. Аргумент на случай, если нужно отобразить список файлов, которые были изменены недавно.
- -type — тип. Поиск файлов определенного типа. Например, если вам нужны только папки или ссылки.
Также вы сами устанавливаете локацию поиска. Сразу после команды find нужно указать область системы, в которой нужно разыскать файл.
- Можно указать директорию полностью. Например: /Downloads/Files .
- Или искать в корневой директории и во всех вложенных в нее: / .
- Можно искать в папке, где пользователь находится прямо сейчас: ./ .
- Ну и в домашней директории: ~ .
Ищем по названию файла
Как я уже написал раньше, за название файла в Linux принимается все от первой буквы имени до расширения. Поэтому существует сразу несколько вариантов поиска по названию. Разберем их на нескольких примерах:
Используем для поиска имя
Начнем с поиска по конкретному названию. Команда для поиска файла с именем «hello» в домашней папке будет выглядеть так: find ~ -name «hello*» -print .
Вот такой простой синтаксис. Наглядно
Тут стоит обратить внимание сразу на несколько деталей. Во-первых, название файла всегда пишется в двойных кавычках. По-другому поиск не заработает. Во-вторых, символ * (звездочка) сразу после названия файла. Она обозначается, что нужно искать только эту часть текста.
Все, что идет дальше (расширение, например) будет игнорироваться. В-третьих, мы пишем __-print__в конце, чтобы вывести результат поиска в терминал и посмотреть, что за файлы мы нашли.
А вот и результаты поиска, полученные благодаря -print.
При этом вы можете указать при поиске название файла и расширение сразу. Это удобно, если у вас на компьютере есть несколько файлов с одинаковым названием, но разным расширением.
Так выглядит поиск конкретного файла
Используем для поиска расширение или часть имени
Теперь перейдем к поиску файла по расширению. Команда для поиска скриптов в формате .js в папке Downloads будет выглядеть так: find ~/Downloads/ -name «*js» -print .
Ставим звездочку перед расширением, чтобы исключить все лишнее из поисковой выдачи
Теперь в поисковой выдаче несколько файлов с одинаковым расширением
Также можно искать файлы, используя часть их названия, и даже комбинировать эту часть с конкретным расширением.
Для примера покажу две команды:
- find ~/Downloads/ -name «[h]*» — print . Эта ищет все файлы, название которых начинается с буквы h .
- 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 в верхнем левом углу над панелью избранных программ.
Источник: dzen.ru
Команда find Linux

find это мощный инструмент для работы с файлами.
С его помощью можно задавать различные составные условия для дальнейших действий над файлами.
Часто ипользуется как первый шаг перед копированием, перемещением, удалением, изменением файлов, соответсвующих определённым условиям.
В этой статье вы можете познакомится с основами применения find. Про применение find совместно с grep , sed , xargs и другими утилитами вы можете прочитать в статье «Продвинутые методы работы с find»
Поиск
Найти и вывести на экран все файлы в директории
find
find .
find . -print
-name: Поиск по имени
Найти по полному имени в текущей директории
find . -name ‘heihei.log’
Если регистр не важен
find . -iname ‘heihei.log’
Поиск по расширению
Найти по расширению файла с помощью wildcard *
Ищем в /usr/share/doc все pdf файлы
-not: обратное условие
Найти в текущей директории все файлы кроме php
find . -not -name ‘*.php’
find . ! -name ‘*.php’
Несколько условий вместе
Найти все файлы, которые начинаются с log но не имеют расширения .txt
find . -name «log*» ! -name ‘*.txt’
-o: Логическое или
Найти либо .html либо .php файлы
find . -name ‘*.html’ -o -name ‘*.php’
Найти и скопировать
Найти и сразу скопировать в текущую директорию
Найти в текущей директории
Удалить из текущей директории
Поиск по типу
Чтобы найти только файлы определённого типа выполните find с опцией type.
Например, что найти все ссылки в директории /etc
find /etc -type l
Подробнее о файлах в Linux читайте в статье «Типы файлов в Linux»
Уровни вложенности
Найти все ссылки только на верхнем уровне вложенности
find /etc -maxdepth 1 -type l
Поиск по размеру файла
Filesystem Size Used Avail Use% Mounted on /dev/sda1 1014M 194M 821M 20% /boot
Найти обычные файлы определённого размера
Чтобы найти обычные файлы нужно использовать -type f
find /boot -size +20000k -type f
find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img /boot/initramfs-3.10.0-1160.el7.x86_64.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img
Файлы бывают следующих типов:
— : regular file
d : directory
c : character device file
b : block device file
s : local socket file
p : named pipe
l : symbolic link
Подробности в статье — «Файлы в Linux»
find /boot -size +10000k -type f
find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img /boot/initramfs-3.10.0-1160.el7.x86_64.img /boot/initramfs-3.10.0-1160.el7.x86_64kdump.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img
То же самое плюс показать размер файлов
find /boot -size +10000k -type f -exec du -h <> ;
find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied 60M /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img 21M /boot/initramfs-3.10.0-1160.el7.x86_64.img 13M /boot/initramfs-3.10.0-1160.el7.x86_64kdump.img 21M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img 14M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img
Поиск по началу имени файла
Обратите внимание, что в find, в отличие от grep , ставить перед началом названия никаких символов не нужно.
find -name ‘topb*’
Поиск по части имени файла
Найти в проекте topbicyle все директории с qa в названии
find topbicycle/ -name ‘*qa*’ -type d
-perm: поиск по правам доступа
find . -type f -perm 0600
find . -type f ! -perm 0600
-path: поиск путей
Если мне нужно посмотреть содержимое директорий /code/php и /code/python
find . -path «./code/p*»
Пример укороченного результата
-prune: ограничить глубину
С помощью path можно посмотреть содержимое всех поддиректорий code на букву p /code/p*
Если нужно посмотреть только поддиректории верхнего уровня — используется -prune
find . -path «./code/p*» -prune
Получили только поддиректории без их содержимого
Исключить директорию из поиска
Из предыдущего параграфа понятно, что с помощью prune можно исключить директорию из поиска.
Пример: найти в ./code все файлы, заканчивающиеся на index.php но проигнорировать поддиректории на p, то есть в директориях python и php не искать.
find ./code -path «./code/p*» -prune -false -o -name «*index.php»
./code/js/errors/index.php ./code/js/index.php ./code/c/index.php ./code/cpp/index.php ./code/go/pointers/index.php ./code/go/declare_variable/index.php ./code/go/constants/index.php ./code/go/index.php ./code/java/index.php ./code/dotnet/index.php ./code/ruby/index.php ./code/theory/index.php ./code/index.php
-false нужен чтобы не выводить проигнорированные директории.
Ещё один способ исключить директорию из поиска
find ./code -name «*.php» -not -path «./code/p*»
Источник: urn.su