Утиліта find — це універсальний і функціональний спосіб пошуку в Linux . Ця стаття — це шпаргалка з описом і прикладами її використання.
Загальний синтаксис
find <where to look> <options>
<where to search> — шлях до кореневого каталогу, з якого слід розпочати пошук. Наприклад, find /home/user — пошук у відповідному каталозі. Для поточного каталогу використовуйте крапку «.».
<options> — це набір правил для пошуку.
* За замовчуванням пошук є рекурсивним. Для пошуку в певному каталозі можна використовувати опцію maxdepth .
Опис опцій
Опція | Опис |
| -name | Пошук за назвою. |
| -inameCase | нечутливий пошук за назвою. |
| -type | Тип об’єкта пошуку. Можливі варіанти:
|
| -size | Розмір об’єкта. Вказується в блоках по 512 байт або просто в байтах (з символом «c»). |
| -mtime | Час модифікації файлу. Вказується в днях. |
| -mmin | Змінити час у хвилинах. |
| -atime | Час останнього доступу до об’єкта в днях. |
| -amin | Час останнього доступу в хвилинах. |
| -ctime | Остання зміна власника або прав на об’єкт за останні дні. |
| -cmin | Останній власник або зміна прав за останні хвилини. |
| -user | Пошук за власником. |
| -group | За групами. |
| -perm | З певними правами доступу. |
| -depth | Пошук слід починати не з кореневого каталогу, а з найглибше вкладеного каталогу. |
| -maxdepth | Максимальна глибина пошуку в каталозі. -maxdepth 0 — пошук тільки в поточному каталозі. За замовчуванням пошук є рекурсивним. |
| -prune | Виключити перелічені каталоги. |
| -mount | Не переходьте на інші файлові системи. |
| -regex | За іменем із регулярним виразом. |
| -regextype <type> | Тип регулярного виразу. |
| -L or -follow | Відображає вміст символічних посилань (symlinks). |
| -empty | Пошук порожніх каталогів. |
| -delete | Видалити знайдено. |
| -ls | Вивід як ls -dgils |
| Знайдено шоу. | |
| -print0 | Шлях до знайдених предметів. |
| -exec <command> {} \; | Виконати команду на знайденому. |
| -ok | Видавати запит перед виконанням -exec. |
Також доступні логічні оператори:
Оператор | Опис |
| -a | Логічне І. Поєднайте кілька критеріїв пошуку. |
| -o | Логічне АБО. Нехай команда пошуку виконує пошук на основі одного з критеріїв пошуку. |
| -not or ! | Логічне НЕ. Інвертує пошуковий термін. |
Повний набір доступних опцій можна отримати за допомогою команди man find .
Знайти приклади використання
Пошук файлу за назвою
1. Простий пошук за назвою:
find / -name “file.txt”
* Цей приклад буде шукати у всій файловій системі файл з іменем file.txt, починаючи з кореневого каталогу / .
2. Пошук файлу за частиною імені:
find / -name “*.tmp”
* ця команда буде шукати всі папки або файли в кореневому каталозі /, що закінчуються на .tmp
3. Кілька умов.
a) Логічне І. Наприклад, файли, що починаються з sess_ і закінчуються на cd :
find. -name “sess_*” -a -name “*cd”
б) Логічне АБО. Наприклад, файли, що починаються з sess_ або закінчуються на cd :
find. -name “sess_*” -o -name “*cd”
c) Регулярні вирази мають більш компактну форму, наприклад:
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. Пошук файлів з новішими . Ця опція доступна з версії 4.3.3 (її можна побачити за допомогою команди find –version ).
a) дата зміни:
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
* всі файли, до яких було здійснено доступ з 10.08.2019.
find. -type f -newerat 2019-10-01 ! -newerat 2019-11-01
* всі файли, до яких було здійснено доступ у жовтні.
c) дата створення:
find. -type f -newerct 2019-09-07
* всі файли, створені з 7 вересня 2019 року.
find. -type f -newerct 2019-09-07 ! -newerct “2019-09-09 07:50:00”
* файли, створені з 09/07/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 %p\n’ | sort-r
* команда знайде всі файли в каталозі /data , додасть дату модифікації до імені та відсортує дані за іменем. В результаті ми отримаємо, що файли будуть розташовані в порядку, в якому вони були змінені.
Обмеження кількості результатів виводу
Найпоширенішим прикладом є вивід одного файлу, який був змінений останнім. Візьмемо приклад сортування та додамо наступне:
find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | 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 {} \;
* У цьому прикладі ми шукаємо всі каталоги ( тип 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.
VPS Linux
VPS-хостинг з віртуалізацією KVM