10 способів роботи з find
- простий пошук
- Пошук за розміром
- Пошук по власнику
- Пошук по групі-власнику
- Пошук з прав доступу
- Використання регулярних виразів
- Робота з часом
- Робота з хвилинами
- обмеження пошуку
- Дії над знайденими файлами
- наостанок
GNU find є однією з найбільш часто використовуваних програм. На перший погляд опції find і їх синтаксис виглядають злегка незрозумілими. Однак, трохи попрактикуватися з find, ви зможете швидко і без зусиль знаходити будь-який файл у вашій системі. Щоб допомогти вам почати працювати з find, розгляньте запропоновані десять способів її використання.
Майте на увазі, що не всі версії find однакові, і та, яку ви використовуєте в Linux, буде відрізнятися від версій для Mac, BSD або Solaris. В основному синтаксис однаковий у всіх версіях, але місцями зустрічаються невеликі відмінності.
простий пошук
Давайте почнемо з простого. Якщо вам відоме ім'я файлу, але ви не знаєте точно в якому каталозі він розташований, синтаксис find буде гранично простий. Просто повідомте find ім'я шуканого файлу:
find -name имя_файла
Якщо файл існує, то find виведе вам список шляхів, в яких зустрічається ім'я зазначеного вами файлу. Виглдеть це буде приблизно так:
jzb @ kodos: ~ $ find -name filename ./projects/filename jzb @ kodos: ~ $
Пошук за розміром
Іноді при пошуку файлу буває потрібно використовувати його додаткові атрибути, як критерій пошуку, а не тільки ім'я. Наприклад, розмір файлу. Наприклад, коли у вашій системі закінчується вільне місце в якомусь дисковому розділі і вам необхідно дізнатися, які файли займають дорогоцінний дисковий простір. За допомогою 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 виведе також і порожні каталоги.
Пошук по власнику
Інший, часто використовуваний, варіант пошуку - пошук за належністю файлу якомусь користувачеві або навіть по його відсутності. Наприклад, ви перемістили якісь файли в іншу систему або ж видалили якогось користувача, ймовірно зробивши файли «сиротами». Відшукати такі файли-сироти можна простою командою:
find -nouser
Для пошуку файлів, що належать якомусь конкретному користувачеві, існують опції -user і -uid. Перша опція приймає як ім'я користувача, так і його ідентифікатор, а друга - тільки ідентифікатор. Наприклад, якщо мені потрібно буде знайти всі файли, власником яких я є, я скористаюся однієї з команд:
find -user jzb find -user 1000 find -uid 1000
Також, вам може знадобитися знайти файли належать користувачу А чи користувачу Б. Для цього необхідно об'єднати дві умови пошуку за допомогою оператора «-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).
Наприклад, давайте все знайдемо файли, які були змінені за останні два дні:
find -mtime +2
Параметри опцій, які працюють з часом, можна інтерпретувати як «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:
find wordpress -maxdepth 1 -name '* js'
Така команда змусить шукати find тільки в каталозі wordpress, не заходячи в підкаталоги, які в ньому містяться. Якщо ви хочете пошукати в цих підкаталогах, але не потикатися глибше - збільште параметр опції -maxdepth на одиницю і т. Д.
Дії над знайденими файлами
Отже, ви знайшли те, що шукали. Що ви будете робити зі знайденим? Використовуючи xargs або опцію find -exec, можна виконувати необхідні дії з знайденими файлами.
Давайте уявимо, що ви хочете змінити власника якихось файлів з root на www-data. Для початку потрібно всі ці файли знайти, а потім вже змінювати їх власника. Зміна власника вручну за списком, отриманого від find звучить якось нудно. Все ж, найкращим рішенням буде використовувати опцію -exec:
find -user root -exec chown www-data {} \;
Така команда змушує find передавати шляху всіх знайдених файлів утиліти chown, яка і буде змінювати власника файлів. Легко і просто!
наостанок
Якщо ви за допомогою find -exec збираєтеся щось видаляти, то обов'язково двічі перевірте, що саме знаходить find, перш, ніж передавати їй команду на видалення знайденого.
По мотивам Linux.Com .
Що ви будете робити зі знайденим?