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

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

В этом случае удобна команда find . Как ее использовать? Конечно, к этой утилите поставляется большая man-страница, но мы рассмотрим некоторые типичные случаи. Просмотреть дерево каталогов, начиная с текущего, и найти файл lostfile.txt:

Если Вы ищете в большом дереве каталогов, команда find может работать довольно медленно. Иногда удобнее использовать команду locate . Она не ищет файл непосредственно в файловой системе, а просматривает свою базу данных. Такой метод намного быстрее, но база данных может устареть. В некоторых дистрибутивах эта база модифицируется каждую ночь. Вы можете время от времени вручную выполнять команду updatedb , чтобы ее модифицировать. locate ищет подстроки:

Допустимое количество орфографических ошибок зависит от длины имени файла, но может быть установлено с помощью опции -t. Чтобы разрешить максимум 2 ошибки и использовать служебный символ просто наберите:

Обзор дерева каталогов

Иногда необходимо получить обзор дерева каталогов. Например, Вы получили новый CD-ROM и хотели бы узнать, что на нем есть. Вы можете просто использовать ls - R . Лично я для удобочитаемости предпочитаю один из следующих способов. Tree (sunsite.unc.edu/pub/Linux/utils/file/tree-1.2.tgz) отображает дерево каталогов в виде диаграммы.

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

Можно воспользоваться небольшой perl процедурой, работающей с командой ls , которая делает подобные вещи. Ее можно загрузить отсюда: lsperl.gz . Существует много других утилит просмотра дерева каталогов, но для большинства случаев этих вполне достаточно.

Поиск файлов по содержанию (поиск текстовых строк в файлах).

Стандартные утилиты для поиска текстовых строк в файлах - grep / egrep для обычных поисков выражения и fgrep для поиска литеральных строк. Чтобы искать выражение во всех файлах в текущем каталоге, просто наберите:

Если Вам трудно запомнить эти длинные команды, используйте маленький скрипт, который можно загрузить отсюда: grepfind.gz . Скрипт еще и удаляет не-печатаемые символы из строки поиска, чтобы Вы случайно не получили в результате поиска egrep -ом двоичный файл.

Очень интересная программа поиска - agrep . Agrep работает в основном подобно egrep , но позволяет искать с учетом орфографических ошибок. Чтобы искать выражение и разрешить максимум 2 орфографические ошибки, наберите:

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

glimpse -i -2 "search exprission"

glimpse - тоже допускает орфографические ошибки (как и agrep) и -2 указывает, что разрешены две ошибки. glimpse доступен на

Команда find в Linux/FreeBSD. Синтаксис команды find.

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

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

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

Опции - начиная с символа «-», после идет название опции:
-d Поиск в подкаталогах перед поиском в самом каталоге
-L При поиске следовать по символическим ссылкам
-maxdepth N При поиске проверять не более чем N вложенных уровней каталогов
-mindepth N Не проверять вложенные каталоги уровня N и меньше
-mount Не искать в каталогах других файловых систем

Параметры поиска

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

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

# find . -type f -name "~*" -print

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# find . -name "~*" -type f -ok rm {} \;

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

ПРИМЕРЫ:

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

# find /var/log -name "*.log" -and \(-size +1k -and -size -1000k \) -and -type f -print

Будут найдены и выведены на экран файлы с расширением *.log, размером от 1кб до 1000кб

Поиск файлов по их владельцу и группе

Эта команда найдет все файлы, у которых нет владельца

Параметры -user или -uid позволяют искать файлы по идентификатору пользователя (UID) и по имени пользователя, а параметр -group по имени группы.

# find . -name "*.log" -user root -group root

Найдет все файлы в текущем каталоге с расширением log пользователя root и группы root

# find -user root -o -user www

Найдет все файлы пользователя root или www

Использование регулярных выражений

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

# find -regextype posix-egrep -regex ".*(php|js)$"

Это выглядит немного сложно, не так ли? В качестве опровержения укажем, что здесь используется синтаксис egrep (-regextype posix-egrep) , а затем задается регулярное выражение, используемое для поиска. Выражение начинается и заканчивается одиночными кавычками для того, чтобы чтобы сама shell-оболочка не пыталась обработать регулярное выражение. Затем идет выражение.*, где используется универсальный символ, соответствующий любому символу или набору символов. Часть (php|js) говорит о том, что надо искать php или js. Конвейер (|) в этом выражении соответствует логическому выражению "или". Наконец, знак доллара ($), которым заканчивается выражение, говорит о том, что эти расширения мы ищем в конце имени файла. Так что если у вас есть файл с именем js.txt, он не будет соответствовать критерию поиска.

Работа со временем
В утилите find есть все для поиска по времени работы с файлом. Вы можете искать по времени доступа (-atime ), либо по времени последней модификации файла (-mtime), либо по времени последнего его изменения (-ctime ).

Например, давайте найдем все файлы, которые не модифицировались последние два дня:

# find -mtime +2

Если вы хотите искать файлы в определенном диапазоне, вы можете комбинировать варианты. Так команда find -mtime +2 -mtime -5 будет означать "два или более дней назад, но не более чем на пять дней назад".

Работаем с минутами
Иногда вам требуется искать файлы, модифицированные в течение прошедшего дня, а предыдущие варианты поиска не слишком точны для этого. Утилита find хороша тем, что в ней также есть параметры -amin , -cmin и -mmin , которые похожи на ранее рассмотренные параметры, но в них используются минуты, а не дни. Так что если вы хотите посмотреть на то, какие файлы были изменены или к каким из них был доступ в последний день, вы можете использовать эти параметры.

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

# find wordpress -name "*js"

Но что, если вы хотите видеть только те JavaScript файлы, которые находятся в директории на самом верхнем уровне? Вы можете ограничить поиск с помощью параметра -maxdepth :

# find wordpress -maxdepth 1 -name "*js"

Поиск будет осуществляться только в директории WordPress, но не в поддиректориях. Если изменить значение -maxdepth на 2, то поиск будет осуществляться в поддиректориях директория WordPress, но не в более глубоких поддиректориях.

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

Допустим, вы хотите изменить владельца файла с root на www-data сразу для большого количества файлов. Поиск всех этих файлов является только первым шагом, вам нужно также изменить владельца файла. Делать это вручную по списку, который возвратила утилита find , весьма утомительно. Поэтому для смены владельцев файлов вы можете захотеть воспользоваться параметром -exec :

# find -user root -exec chown www-data {} \;

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

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

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

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 Показывает содержимое символьных ссылок (симлинк).
-empty Искать пустые каталоги.
-delete Удалить найденное.
-ls Вывод как ls -dgils
-print Показать найденное.
-print0 Путь к найденным объектам.
-exec <команда> {} \; Выполнить команду над найденным.
-ok Выдать запрос перед выполнением -exec.

Полный набор актуальных опций можно получить командой man find .

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

Поиск файла по имени

find / -name "file.txt"

* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня / .

Поиск файла по части имени:

find / -name "*.tmp"

* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp

Найти все файлы или папки, которые начинаются на sess_ и заканчиваются на cd

find . -name "sess_*" -a -name "*cd"

* -a: логическое И, -o: логическое ИЛИ.

Поиск по дате

1. Поиск файлов, которые менялись определенное количество дней назад:

find . -type f -mtime +60

* данная команда найдет файлы, которые менялись более 60 дней назад.

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

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

По типу

Искать в текущей директории и всех ее подпапках только файлы:

* f — искать только файлы.

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

Ищем все справами на чтение и запись:

find / -perm 0666

Находим файлы, доступ к которым имеет только владелец:

find / -perm 0600

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

find / -type f -exec grep -i -H "content" {} \;

* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержиться строка content .

С сортировкой по дате модификации

find /data -type f -printf "%TY-%Tm-%Td %TT %p\n" | sort -r

* команда найдет все файлы в каталоге /data , добавит к имени дату модификации и отсортирует данные по имени. В итоге получам, что файлы будут идти в порядке их изменения.

find /home/user/* -type d -exec chmod 2700 {} \;

* в данном примере мы ищем все каталоги (type d ) в директории /home/user и ставим для них права 2700 .

Чистка по расписанию

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

Открываем на редактирование задания cron:

И добавляем:

0 0 * * * /bin/find /tmp -mtime +14 -exec rm {} \;

* в данном примере мы удаляем все файлы и папки из каталога /tmp, соторые старше 14 дней. Задание запускается каждый день в 00:00 .
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.

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

1) find: Для поиска файлов из командной строки вы можете использовать команду “find”. У этой команды следующий синтаксис:

find path criteria action

“path” - Секция для указания директории поиска. Если ничего не указано поиск идет по текущей директории.

“criteria” - Опции поиска.

“action” - Опции, которые влияют на состояние поиска или контролируют его, например,

2) locate: Команда “locate” это альтернатива команде “find -name”. Команда find ищет файлы в выбранной части файловой системы и процесс может быть не очень быстрым. С другой стороны, команда locate ищет файлы в базе данный, созданной специально для этих целей /var/lib/locatedb, что происходит намного быстрее. Для обновления базы используется команда updatedb .

3) whereis: whereis” возвращает место расположения кода (опция -b), ман-страниц (опция -m), и исходные файлы (опция -s) для указанной команды. Если опции не указываются, выводится вся доступная информация. Эта команда быстрее чем “find” но менее полная.

4) which: Команда “which” ищет все пути перечисленные в переменной PATH для указанной команды.

5) type:

При вызове без опций показывает, как имена будут интерпретироваться

при использовании в качестве имени команды. Если использована опция -a , команда type выдает список всех каталогов, где есть выполняемый файл с

соответствующим именем. В список включаются также псевдонимы и функции,

если только не указана опция -p . К

хэшу команд не обращаются, если указана опция -a . Команда type возвращает 0,

если хоть один из аргументов найден, и 1 в противном случае.

Постовой

Explo.ru - все про туризм и отдых: горящие туры и путевки в Турцию, Египет,

    Найдите файл по его имени. Такой простейший поиск выполняется при помощи утилиты find . Приведенная ниже команда будет искать файл в текущем каталоге и во всех его подкаталогах.

    find -iname "имя файла"

    • Введите -iname вместо -name , чтобы проигнорировать регистр в веденном имени файла. Команда -name учитывает регистр.
  1. Начните поиск в корневом каталоге. Чтобы запустить поиск по всей системе, к запросу добавьте модификатор / . В этом случае команда find будет искать файл во всех каталогах, начиная с корневого.

    find / -iname "имя файла"

    • Можно начать поиск в определенном каталоге; для этого замените / на путь к каталогу, например, /home/max .
    • Можно использовать. вместо / , чтобы искать файл только в текущем каталоге и его подкаталогах.
  2. Используйте символ обобщения . * , чтобы найти файлы, имя которого соответствует части запроса. При помощи символа обобщения * можно найти файл, полное имя которого неизвестно, или найти все файлы с определенным расширением.

    find /home/max -iname "*.conf"

    • Эта команда найдет все файлы с расширением.conf в папке пользователя Max (и ее подпапках).
    • Воспользуйтесь этой командой, чтобы найти все файл, имена которых соответствуют части запроса. Например, если на компьютере хранится множество файлов, связанных с WikiHow, найдите все файлы, введя "*wiki*" .
  3. Облегчите управление результатами поиска. Если результатов поиска слишком много, среди них сложно найти нужный файл. Используйте символ | , чтобы результаты поиска фильтровались командой less. Это облегчит просмотр и фильтрование результатов поиска.

    find /home/max -iname "*.conf" | less

    Найдите конкретные элементы. Используйте модификаторы, чтобы в результатах поиска отобразить только определенные элементы. Можно искать обычные файлы (f), каталоги (d), символьные ссылки (l), устройства посимвольного ввода-вывода (с) и блочные устройства (b).

    find / -type f -iname "имя файла"

  4. Отфильтруйте результаты поиска по размеру файлов. Если на компьютере хранится множество файлов с похожими именами, но размер искомого файла известен, отфильтруйте результаты поиска по размеру файлов.

    find / -size +50M -iname "имя файла"

    • Эта команда найдет все файлы, размер которых превышает 50 МБ. Используйте модификатор + или - , чтобы указать на увеличение или уменьшение размера. Если модификатора + или - нет, команда найдет файлы, размер которых точно совпадает с указанным размером.
    • Результаты поиска можно отфильтровать по байтам (c), килобайтам (k), мегабайтам (M), гигабайтам (G) или блокам по 512 байт (b). Обратите внимание, что приведенные модификаторы учитывают регистр.
  5. Используйте логические операторы (булевы операторы), чтобы объединить поисковые фильтры. Можно использовать операторы -and , -or , -not , чтобы объединить различные поисковые запросы в один запрос.

    find /travelphotos -type f -size +200k -not -iname "*2015*"

    • Эта команда найдет файлы в папке «Travelphotos», размер которых больше 200 кБ и в именах которых нет числа 2015.