10 Способів роботи з find
GNU find є однією з найбільш часто використовуваних програм. На перший погляд опції find і їх синтаксис виглядають злегка незрозумілими. Однак, трохи попрактикуватися з find. ви зможете швидко і без зусиль знаходити будь-який файл у вашій системі. Щоб допомогти вам почати працювати з find. розгляньте запропоновані десять способів її використання.

Майте на увазі, що не всі версії find однакові, і та, яку ви використовуєте в Linux, буде відрізнятися від версій для Mac, BSD або Solaris. В основному синтаксис однаковий у всіх версіях, але місцями зустрічаються невеликі відмінності.
простий пошук
Давайте почнемо з простого. Якщо вам відоме ім'я файлу, але ви не знаєте точно в якому каталозі він розташований, синтаксис find буде гранично простий. Просто повідомте find ім'я шуканого файлу:
find - name ім'я _ файлу
Якщо файл існує, то find виведе вам список шляхів, в яких зустрічається ім'я зазначеного вами файлу. Виглдеть це буде приблизно так:
Пошук за розміром
Іноді при пошуку файлу буває потрібно використовувати його додаткові атрибути, як критерій пошуку, а не тільки ім'я. Наприклад, розмір файлу. Наприклад, коли у вашій системі закінчується вільне місце в якомусь дисковому розділі і вам необхідно дізнатися, які файли займають дорогоцінний дисковий простір. За допомогою find ви можете знайти такі файли і вже потім вирішити, за рахунок чого можна вивільнити необхідне дисковий простір.
Для такого випадку у find є опція -size. приймаюча як параметр розмір, який є критерієм пошуку. Розмір можна вказувати починаючи з байтів (b). закінчуючи гігабайтами (G). Наприклад, щоб виконати пошук файлів розміром 100 кілобайт, можна використовувати команду:
find - size 100k
Однак такий варіант може не підійти в нашому випадку. Найбільш сприятливим буде пошукати файли розмірів більше (або менше) заданого. Щоб виконати такий пошук, просто додайте «+» або «-» до розміру, і find буде шукати файли більшого або меншого розміру відповідно, ніж вказано. Наприклад, наступна команда знайде всі файли розмірів більше 100 кілобайт:
find - size + 100k
а ця - менш, ніж 100 кілобайт:
find - size - 100k
Також, ви можете попросити find знайти всі порожні файли:
find - empty - type f
Зверніть увагу на зазначену опцію -type з параметром «f». яка вказує find шукати тільки звичайні файли. Якщо не вказати це, то find виведе також і порожні каталоги.
Пошук по власнику
Інший, часто використовуваний, варіант пошуку - пошук за належністю файлу якомусь користувачеві або навіть по його відсутності. Наприклад, ви перемістили якісь файли в іншу систему або ж видалили якогось користувача, ймовірно зробивши файли «сиротами». Відшукати такі файли-сироти можна простою командою:
Для пошуку файлів, що належать якомусь конкретному користувачеві, існують опції -user і -uid. Перша опція приймає як ім'я користувача, так і його ідентифікатор, а друга - тільки ідентифікатор. Наприклад, якщо мені потрібно буде знайти всі файли, власником яких я є, я скористаюся однієї з команд:
find - user тисячі
Також, вам може знадобитися знайти файли належать користувачу А чи користувачу Б. Для цього необхідно об'єднати дві умови пошуку за допомогою оператора «-o»:
find - user root - o - user www - data
Така команда буде шукати файли, власником яких є користувач root або ж користувач www-data. Якщо ж, наприклад, ви хочете знайти файли, власником яких користувач не є. використовуйте оператор «-not»:
find - not - user www - data
Природно, оператори працюють і з іншими опціями. Наприклад, наступна команда знайде файли, власником яких є www-data і які розміром не більше ста кілобайт:
find - user www - data - not - size + 100k
Пошук по групі-власнику
Ще один спосіб використання find - пошук файлів, що належать якоїсь групи користувачів. Для цього використовується опція «-group». параметром якої повинно бути ім'я групи або її ідентифікатор. наприклад:
find - group admin
У повсякденному житті ви, скоріш за все, будете комбінувати цю опцію з іншими. Наприклад, якщо вам потрібно відшукати файли, що належать певним користувачеві і групі.
Пошук з прав доступу
Іноді у вас може виникати необхідність знайти файли, доступні для запису кому завгодно або файли, які мають будь-які інші «погані» дозволу. Подібний пошук find може здійснювати за допомогою різних опцій. Найпростіші з них - це оператори -readable. -writable і -executable. які працюють стосовно користувачеві, який жбурнув find. Майте на увазі, що в занадто древніх версіях find ці опції відсутні.
Інший спосіб шукати файли певним режимом доступу - використання опції -perm. що дозволяє точно визначати права доступу шуканих файлів. Наприклад, якщо ви хочете знайти файли, біти виконання яких встановлені для власника і групи, використовуйте команду:
find - type f - perm - 110
Тут параметр «110» повідомляє find набір бітів доступу, а «-» змушує ігнорувати всі інші. Таким чином, якщо файл має до всього іншого встановлені біти читання і записи, він також буде відповідати критерію пошуку, оскільки для find важливо лише те, що встановлені зазначені біти виконання.
Якщо вам необхідно точний збіг із зазначеним режимом доступу, то приберіть опцію «-».
А що, якщо вам необхідно знайти файли, що виконуються власником або групою? У цей випадку замість «-» використовуйте «/»:
find - type f - perm / 110
Пошук по правам доступу часто пригождается, хоча і не позбавлений деякої складності, і вам може знадобитися якийсь час, перш, ніж ви звикнете до його синтаксису. Особливо це стосується новачків, які ще толком не розібралися з механізмом бітів доступу файлів. В цьому випадку читання man-сторінки find особливо рекомендується.
Використання регулярних виразів
Іноді вам може знадобитися використання регулярних виразів, щоб визначити критерії пошуку. І find підтримує їх навіть більшою мірою, ніж ви, можливо, очікували. find не тільки підтримує використання регулярних виразів, але і дозволяє використовувати різні їх типи. Тип регулярного виразу можна визначити за допомогою опції -regextype. яка приймає параметри posix-awk, posix-egrep і тому подібні. В man-сторінці ви знайдете повний перелік підтримуваних типів регулярних виразів вашою версією find.
Невеликий приклад. Скажімо, вам потрібно знайти файли, які мають розширення «.php» і «.js». Таке можна здійснити за допомогою такої команди:
find - regextype posix - egrep - regex '. * (php | js) $'
Виглядає страшнувато, чи не так? Ця команда говорить find використовувати синтаксис регулярних виразів egrep (-regextype posix-egrep). а потім повідомляє само регулярний вираз. Вираз обрамлено одинарними лапками, щоб оболонка не намагалася по-своєму інтерпретувати спецсимволи, що використовуються в вираженні. У самому вираженні «. *» Означає будь-який символ, який повторювався нуль або більше разів. Частина виразу «(php | js)» повідомляє про необхідність шукати «php» або «js» (символ вертикальної риски використовується для визначення оператора «або»). І, нарешті, знак долара в кінці виразу повідомляє про те, що попередня частина виразу повинна шукатися в кінці рядка.
Так само, як і з правами доступу, регулярні вирази можна комбінувати.
Робота з часом
Що, якщо вам знадобиться знайти файли, грунтуючись на їхньому віці? Іноді буває, що знаєш, в якому проміжку часу файл був створений, а все інше - забулося. Або ж, вам може знадобитися відшукати якісь старі файли, які пора видалити. Загалом, причин може бути купа.
find в повному обсязі вміє працювати з часом, дозволяючи шукати за часом останнього доступу до файлу (-atime). часу останньої зміни файлу (-mtime). або за часом його створення (-сtime).
Наприклад, давайте все знайдемо файли, які були змінені за останні два дні:
Параметри опцій, які працюють з часом, можна інтерпретувати як «N раз по 24 години» і в дійсності означають проміжок часу. Якщо ви передасте find опцію «+1». то вона зрозуміє це як «не менше, ніж 24 години назад, але не більше, ніж 48».
Ці опції ви також можете комбінувати, якщо потрібно відшукати файли, тимчасові критерії пошуку знаходяться в якомусь проміжку. Так, команда
find - mtime + 2 - mtime - 5
означає «два або більше дні тому, але не більше п'яти днів назад».
Робота з хвилинами
Іноді буває потрібно знайти файли, змінені за останні 24 години, і в цьому випадку розглянуті опції * time зі зрозумілих причин не підійдуть. Однак, на цей випадок, у find припасені спеціальні опції -amin, -cmin, -mmin. які працюють подібно вище розглянутим, з тією різницею, що в якості параметрів вони приймають хвилини. а не добу. Так що, якщо вам потрібно знайти якісь файли, змінені, наприклад, протягом робочого дня - це ті самі опції, які вам допоможуть.
обмеження пошуку
Іноді find видає набагато більше результатів пошуку, ніж вам потрібно. За допомогою опції -maxdepth ви можете обмежити find таким чином, щоб вона не «заривалась» занадто глибоко. Наприклад, якщо ви хочете знайти всі файли c розширенням «js» в каталозі wordpress, можна скористатися командою:
find wordpress - name '* js'
Але що, якщо вас цікавлять файли лише з каталогу верхнього рівня? Немає проблем: обмежте описки за допомогою опції -maxdepth: