Як користуватись утилітою find?

На кожному комп’ютері знаходяться тисячі файлів і часто щоб знайти потрібний необхідно чимало часу.

команда find

Для полегшення пошуку існує окрема спеціалізована категорія програм, як графічних так і консольних. У більшості випадків графічні програми є надбудовою над консольними.

Однією з базових утиліт для пошуку в операційній системі Linux є консольна програма find. Вона входить до базового набору дистрибутиву у пакеті findutils.

Програма може приймати різноманітні аргументи командного рядка для створення цілого виразу для пошуку. При виявленні файлу з іменем та параметрами, що відповідають заданим критеріям find друкує ім’я цього файлу на екрані.

Команда має багато параметрів та опцій і є потужним інструментом, який можна використовувати в скриптах. Розглянемо на прикладах можливості та варіанти використання find.

Отримання переліку файлів в поточні теці та її підтеках

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

Вважайте, що вам доведеться вказати повний шлях, якщо тека вміст якої ви хочете переглянути не є поточною.

Пошук файлів за назвою

Якщо бажаєте знайти певний файл за назвою, то для цього є опція -name

find [тека] -name [назва_файлу]

Наприклад, щоб знайти в поточному каталозі файл з ім’ям ‘testfile1.txt’ необхідно скористатись наступний синтаксисом:

find . -name testfile1.txt

Аналогічно можна шукати файл в іншій теці. Якщо тека є підтекою поточного робочої теки, вам нічого не потрібно робити, оскільки команда автоматично здійснює пошук у всіх підкаталогах.

Але якщо це взагалі окремий каталог, то вам доведеться вказати повний шлях до нього. Наприклад, наступна команда буде шукати файл у домашній теці користувача:

find /home -name testfile1.txt

Пошук файлів певного типу

Команда find також може знаходити однотипні файли. Наприклад, вираз з наступним синтаксисом буде шукати всі .txt файли в поточній теці(та її підтеках):

find . -name "*.txt"

Не чутливий до регістру пошук

За умовчанням утиліта find здійснює пошук з урахуванням регістру (тобто розглядає символи верхнього та нижнього регістру як різні). За бажанням, ви можете змусити команду проводити пошук нечутливий до регістру. Це можна зробити завдяки опції -iname.

find -iname [назва_файлу]

Наприклад:

 find -iname testfile1.txt

Відображення тільки тих імен, які не відповідають шаблону пошуку

Якщо бажаєте, ви навіть можете наказати команді find показати імена файлів, які не відповідають шаблону пошуку (це так званий інверсний пошук). Ви можете отримати доступ до цієї функції за допомогою символу “!” або оператору -not.
Наприклад:

 find . -not -name “*.txt”

Обмеження пошуку до рівня(-ів) каталогу

В find є можливість обмежити рівень пошуку до певної глибини каталогу. Це відбувається з опцією -maxdepth.

find . -maxdepth 3 -name "*.txt"

Де ‘-maxdepth 3’ примушує утиліту зайти всередину та шукати лише три рівні, при цьому перший рівень – ваш поточний (робочий) каталог.

На противагу maxdepth існує інакша опція mindepth. Цей параметр повідомляє find про те, що необхідно здійснити перехід в підтеку рівня N перед початком пошуку.

Наприклад:

find . -mindepth 3 -name "*.txt"

Пошук файлів за розміром

Пошук файлів за розміром одна з найзатребуваніших функцій. Для цього необхідно використовувати опцію -size та вказати розмір файлу додавши суфікс, що позначає одиниці вимірювання. Допускається використання таких суфіксів:
* ‘b’ для блоків по 512 байт (використовується за умовчанням)
* ‘c’ для байт
* ‘w’ для двох байтових слів
* ‘k’ для Кілобайт
* ‘M’ для Мегабайт
* ‘G’ для Гігабайт

Наприклад, якщо хочете в поточній теці знайти всі файли більші за 100 Мегабайт наберіть таку команду:

find . -size +100M

Вивід імен порожніх файлів

За необхідності ви можете використовувати команду find для виводу списку всіх порожніх файлів в певній теці (та її підтеках). Для цього призначений параметри -empty.

Наприклад, для показу списку всіх порожніх файлів у вашій поточній теці ви можете скористатись такою командою:

find . -empty

Пошук файлів, що належать певній групі користувачів

Команда find також дозволяє здійснювати пошук файлів, що належать певній групі користувачів. Це можливо завдяки наявності параметру -group. Наприклад, наступний вираз виводить список всіх файлів з вашої поточної теки та її підтек, що належать групі користувачів “howtoforge”.

find . -group howtoforge 

Пошук файлів, що належать певному користувачу

Утиліта find за допомогою параметру -user може шукати файли за іменем їх власника. Наприклад, наступна команда виведе назви всіх файлів з розширенням “.txt” , власником яких є користувач з ім’ям “prolinuxua”:

find . -user prolinuxua -name "*.txt"

Пошук нещодавно змінених файлів

Команда find дозволяє здійснювати пошук файлів недавно модифікованих файлів. Для цього призначений параметр -mmin. При використання даної опції необхідно вказувати число, що відповідатиме відповідній кількості хвилин з моменту модифікації.

Наприклад, якщо ви хочете здійснити пошук файлів з розширенням .txt (у вашій поточні теці), які були змінені 1 хвилину тому, ви можете скористатись наступною командою:

find . -mmin 1 -name "*.txt"

Пошук файлів, модифікованих після вказаного файлу

Так, програма find дозволяє проводити пошук навіть тих файлів, котрі були змінені після певного файлу. Для увімкнення цієї функції використовується параметр -newer, після якого слід вказувати ім’я файлу(з часом зміни якого буде порівнюватись час зміни кожного файлу, який знаходиться в поточній теці).

Приклад команди:

 find . -newer ./examples/find/howtoforge/old.txt -name "*.txt"

Вивід імен всіх підтек з теки

Окрім всіх зазначених, існує параметр find, що дозволяє показати імена всіх підтек поточної теки. Це параметр -type із значенням d.
Наприклад:

find -type d

Окрім згаданого значення d, існують ще й інші символи, які можуть передаватись в значення параметра -type. Повний їхній перелік можна знайти на сторінці довідки.

Пошук файлів на основі часу останнього доступу

З командою find можна здійснювати пошук файлів на основі часу останнього доступу до них – ви повідомляєте утиліті про те, що потрібно вивести перелік імен файлів, які були відкриті N хвилин тому. Для використання цієї функції застосовується параметр -amin.

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

 find -amin 1 -name "*.txt"

Виконання дії після пошуку

При використанні find є можливість для виконання дій, які відбудуться при знаходженні файлу з параметрами, що задовольняє умови пошуку. Для цього створена опція exeс. Вона вказує яку команду (дію) слід виконати після пошуку. Всі символи розташовані за опцією вважаються її аргументами допоки не зустрінеться символ крапка з комою (;).

Наприклад, наступна команда видалить в поточній теці (та її підтеках) всі файли більші за один Гігабайт:

find . -size +1G -exec /bin/rm {} \;

Будьте обережними, при застосуванні опції exec слід дуже уважно друкувати аргументи і команди.

Звичайно, що це не повний перелік можливих сценаріїв використання програми find. Їх дуже багато і згадати повністю всі варіанти в короткій статті неможливо. Для ширшого ознайомлення з функціональністю утиліти скористайтеся довідкою.


Використані матеріали з сайтів Howtoforge та linuxaria