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

25 примеров использования утилиты find
Photo by Paul Zoetemeijer / Unsplash

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

Утилита find позволяет искать по:

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

Если файл был найден, то мы можем сделать следующее:

  • просмотреть или отредактировать
  • сохранить
  • удалить или переименовать
  • сменить права доступа
  • любое другое действие

Немного примеров:

Простой поиск

1. Поиск всех обычных файлов

$ find Symfony -type f
Symfony/web/.htaccess
Symfony/web/app.php
Symfony/web/app_dev.php
Symfony/web/robots.txt
...

2. Поиск всех каталогов

$ find Symfony -type d
Symfony/
Symfony/web
Symfony/web/bundles
Symfony/web/bundles/webprofiler
...

3. Поиск по имени файла или каталога

$ find Symfony -name '*config*';
Symfony/app/config
Symfony/app/config/config_prod.yml
Symfony/app/config/config.yml
...

4. Поиск по имени (регистронезависимый)

$ find Symfony -iname '*config*';
...
Symfony/.../Loader/ConfigurationLoader.php
Symfony/.../ConfigurationResource.php
...
Symfony/app/config
Symfony/app/config/config_prod.yml
Symfony/app/config/config.yml
...

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

5. Найти все файлы, размер которых 300MB

$ find . -size 300M

6. Найти все файлы, размер которых больше 300MB

$ find . -size +300M

7. Найти все файлы, размер которых меньше 300MBкаталоги

$ find . -empty

Поиск по дате

GNU/Linux хранит последнюю дату следующих операций:

Операция Значение Опции find
access чтение содержимого файла -atime, -amin
modification изменение контента файла -mtime, -mmin
change of status смена имени файла или атрибутов (права доступа, владелец, ...) -ctime, -cmin

Чтоб узнать даты файла можно использовать команду stat:

$ stat index.php
...
Access: 2016-06-02 22:53:22.813885684 -0500
Modify: 2016-05-08 12:12:12.971073193 -0500
Change: 2016-05-08 12:12:12.971073193 -0500

10. Найти файлы с датой доступа менее 15 дней назад

$ find . -atime -15

11. Найти модифицированные файлы более 7 дней назад

$ find . -mtime +7

12. Найти измененные файлы в промежутке от 2 до 6 минут назад

$ find . -cmin +2 -cmin -6

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

13. Найти файлы пользователя sedlav

$ find . -user sedlav -type f

14. Найти файлы, которые относятся к группе flossblog

$ find . -group flossblog -type f

15. Найти файлы, где владелец имет uid между 500 и 1000 (исключая 500 и 1000)

$ find . -uid +500 -uid -1000 -type f

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

16. Найти все файлы, которые не принадлежат ни одному пользователю

$ find . -nouser

17. Найти все файлы, которые не принадлежат ни одной группе

$ find . -nogroup

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

find позволяет искать файлы, которые может читать (-readable), писать
(-writable) или запускать (-executable) текущий пользователь или файлы,
которые имеют определенные права

18. Найти все файлы, которые может читать текущий пользователь

$ find . -readable

19. Найти все файлы, которые может записывать текущий пользователь

$ find . -writable

20. Найти все файлы, которые может запускать текущий пользователь

$ find . -executable

Поиск файлов с определенными правами доступа

-perm PMODE

  • PMODE может быть числовым или символьным
  • PMODE может иметь префикс / или -
  • Если PMODE не имеет префикса / или -, тогда права файла должны точно
    соответствовать PMODE
  • Если PMODE имеет префикс -, то права файла должны содержать PMODE
  • Если PMODE имеет префикс /, то права файла должны содержать любой из
    битов указанных в PMODE (символьные права не допустимы)
Права Числовое обозначение Символьное обозначение
Чтение 4 r
Запись 2 w
Запуск 1 x

Примеры:

21. Найти все файлы, владелец и группа которых имеют права на чтение и запись, а остальные могут только читать
$ find -perm 664
22. Найти все файлы, владелец и группа которых имеют права на чтение и запись, а остальные могут только читать

Примечание: - перед правами указывает на то, что будут найдены так же
все файлы с правами: 777, 666, 776

$ find . -perm -664
23. Найти все файлы, которые может модифицировать (записывать) любой пользователь
$ find . -perm /222

Расширенный поиск

24. Поиск на основе регулярных выражений по каталогам на 1 уровень ниже

Найти все каталоги одним уровнем ниже каталога project (не рекурсивный
поиск), которые не пусты, не оканчиваются на цифру, old backups, bkp или
содержат слова backup, copy, new с последующим одинм из символов -_. .

$ PATTERN='.*/((.*([0-9]|old|ba?c?ku?ps?))|(..*)|(copy|new|backup|back|)[-_.].*)$';
$ find project -maxdepth 1 -mindepth 1 -regextype posix-egrep ! -iregex  $PATTERN  ! -empty -type d 

25. Комбинируем find, xargs и grep

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

$ find project -name '*.php' -type f -print0 | xargs -0 grep -l ireg

Оригинал статьи

Read more

Самохостинг (часть 2) - Динамический роутинг на Keenetic

Самохостинг (часть 2) - Динамический роутинг на Keenetic

Допустим у нас есть роутер Keenetic. Нам нужно, чтоб некоторые сайты грузились через поднятый на нем туннель (это может быть Wireguard, L2TP или даже банальный Socks5 proxy). Например, нас забанил Youtube по нашему внешнему IP адресу 😉, но мы все равно хотим его смотреть, да не на телефоне, а на нормальном

Самохостинг - стиль жизни

Самохостинг - стиль жизни

Я тут и тут писал про свой домашний сервер, но нигде не упоминал, что есть еще один сервер в ДЦ, где хостятся сайтики и кучка еще разных сервисов. Да и времени прошло с момента написания тех статей не мало. Сервер тот остался в другой стране и, как результат, все, что

Мониторинг долгих запросов PostgreSQL в Prometheus

Мониторинг долгих запросов PostgreSQL в Prometheus

Предположим, что у вас есть PostgreSQL (AWS RDS или классический PostgreSQL server), Prometheus, postgres exporter и alertmanager с Grafana. Стоит задача присылать уведомления о том, что в Postgres подвис запрос. Причина и т.п. нас мало интересует. Нужно просто сказать всем, кому положено, что есть проблема и ее нужно решить.

Почему я всё ещё люблю Fish Shell

Почему я всё ещё люблю Fish Shell

В 2017 году я написала о том, как сильно люблю Fish Shell, и спустя 7 лет ежедневного использования, я нашла ещё больше причин для восхищения. Поэтому решила написать новый пост, где соберу старые и новые причины моей любви к этой оболочке. Сегодня я задумалась об этом, потому что пыталась понять,