Розширені можливості використання команди find у UNIX

Ніщо не викликає таке хвилювання, як дослідження, знайомства з новими людьми, місцями, речами. Зона дослідження може змінитися, але деякі принципи залишаться тими самими. Одним із цих принципів є ведення журналу подорожі; інший принцип – вміти використовувати доступні інструменти.
Операційна система UNIX дуже схожа на велику нерозмічену на карті дику місцевість. І під час подорожі цією незвіданою землею можна знайти інструменти, які стануть у нагоді надалі. Команда find є таким інструментом. Команда find може навіть більше, ніж просто шукати файли; вона може автоматично виконувати послідовність інших команд UNIX, передаючи виявлені файлові імена на вхід іншим командам, як пояснюється у цій статті.
Майже необмежений пошук
Усі операційні системи мають інструмент пошуку файлів. На відміну від більшості таких інструментів, команда find в UNIX може автоматично виконувати різні операції над знайденими нею файлами.
Стандартні інструменти find , інтегровані в графічний інтерфейс користувача (GUI), дозволяють виконувати кілька спільних завдань зі знайденими файлами: їх можна вибрати для вирізання, вставки, копіювання; ці файли можна перемістити до нового каталогу; можна відкрити їх програмою, за допомогою якої ці файли було створено. Ці операції складаються з двох і більше кроків і не є автоматичними – спочатку виконується пошук файлів, потім, використовуючи GUI-інтерфейс, ці файли позначаються для виконання наступної операції. Цей підхід добре підходить для багатьох користувачів, але дослідник хоче більше.
Команда find може видаляти, копіювати, переміщати та виконувати знайдені файли. Додатково, з параметром -exec find можеавтоматично проганяти файли через потрібну послідовність команд UNIX. find може навіть запитати підтвердження перед виконанням подібних операцій із будь-яким файлом.
Спрощення керування файловою системою
Команда find, як і більшість команд у UNIX, має величезну кількість можливих опцій та прапорів, яка може відлякати людей від докладного вивчення даної команди, але справжні дослідники не злякаються великої кількості опцій. Є добрий загальний принцип – спрощення складного питання веде довгий шлях. Запустіть xterm і виконайте наступну команду:
Параметр -exec дуже корисний. Коли файл, який відповідає пошуковим критеріям, знайдено, параметр -exec визначає, що робити з цим файлом. У цьому прикладі комп'ютера дається послідовність команд:
- Здійснити пошук по всьому вмісту поточного каталогу – точка ( . ) після find.
- Знайти всі файли, ім'я яких закінчується на .gif (графічні файли).
- Вивести список усіх знайдених файлів, використовуючи команду ls.
Параметр -exec потребує подальшого вивчення. Коли виявлено ім'я файлу, що відповідає пошуковому запиту, команда find виконує рядок ls <> , підставляючи ім'я файлу і шлях до нього <> . Якщо буде знайдено файл saturn.gif, find виконає команду:
Частина статті, що залишилася, будується на наступному основному принципі: вдумливе використання команди find може значно спростити управління файловою системою UNIX. Наприклад, використовуючи параметр –fstype , команда find може виконувати команди, які залежать від типу файлової системи, у якій було знайдено файл. Крім того, було б корисно, якби find виводила запит на підтвердження перед тим, як виконувати будь-які команди над знайденим файлом; зробити це можна за допомогоюпараметра –ok, як буде показано далі.
Додаткові можливості
Важливою альтернативою параметру -exec є параметр -ok; його поведінка така сама, як у -exec , але перед виконанням будь-якої команди над знайденим файлом він виводить попередження користувачеві. Припустимо, що потрібно файл за файлом (file-by-file) видалити більшу частину .txt-файлів у домашньому каталозі. При автоматизованому пошуку find операції видалення, такі як команда rm UNIX, небезпечні, оскільки можливе ненавмисне видалення важливих файлів; можливо, слід вивчити всі знайдені файли, перш ніж видаляти їх.
Наступна команда виводить список усіх .txt-файлів у домашньому каталозі. Щоб видалити ці файли, необхідно, коли команда find виведе ім'я файлу, ввести Y або y:
Кожен знайдений файл виводиться так, а система робить паузу для введення Y чи y . Система не видаляє файл, якщо натиснутиEnter. Лістинг 1 містить приклад результатів роботи команди find.
Лістинг 1. Приклад результатів
Після кожного знака питання система зупиняється; у цьому випадку для переходу до наступного файлу була натиснута клавішаEnter (ніякі файли не були видалені). Параметр -ok дозволяє керувати автоматичною обробкою кожного файлу, роблячи безпечнішим процес автоматичного видалення файлів.
Буває так, що при використанні –ok потрібно підтверджувати або відхиляти видалення занадто великої кількості файлів окремо. У такому разі для виведення імен усіх файлів, які потрібно видалити, слід виконати команду find із параметром –exec ls . Потім, вивчивши список і переконавшись, що важливі файли не буде видалено, виконайте команду ще раз, замінивши ls на rm .
І -exec і -ok – корисніпараметри, проте перш ніж їх використовувати, потрібно вирішити, який найбільш підходить для конкретної ситуації. Пам'ятайте, що безпека понад усе!
Використовуйте find творчо
За допомогою команди find можна виконати безліч завдань. Цей розділ розглядає кілька способів застосування find для керування файловою системою.
Щоб не ускладнювати ситуацію, у цих прикладах не використовуються -exec команди, які перенаправляють виведення з однієї команди до іншої. Однак наведені нижче команди можна вільно використовувати з параметром -exec команди find.
Видалення тимчасових файлів
Команду find можна використовувати для видалення з каталогів та підкаталогів тимчасових файлів, створених під час звичайної роботи, тим самим звільняючи дисковий простір. Щоб це зробити, використовуйте таку команду:
Маски файлу (file masks), що знаходяться у круглих дужках, визначають типи файлів, які мають бути видалені; перед кожною маскою файлу стоїть -name. Цей список можна розширити та включити до нього будь-які типи тимчасових файлів, які потрібно видалити із системи. Якщо розглядати компілювання та компонування коду, програмісти та їх інструментальні засоби генерують файли наступних типів, вказаних у прикладі: a.out, *.o та core. Інші користувачі мають подібні тимчасові файли, що часто генеруються, і можуть відредагувати рядок команди під відповідні типи файлів (використовуючи маски файлів *.tmp, *.junk та інші). Також буде корисним помістити цю команду в сценарій clean , який можна буде виконати щоразу, коли знадобиться очистити каталог.
Копіювання вмісту каталогів
Команда find дозволяє повністю скопіювати вміст каталогу, зберігаючи при цьому права доступу, тимчасовімітки та ім'я власника для кожного файлу та підкаталогу. Щоб це зробити, необхідно скомбінувати використання команд find і cpio як показано в лістингу 2.
Лістинг 2. Комбінування команд find та cpio
Команда cpio призначена для копіювання файлів у/з cpio або tar архіву, при цьому автоматично зберігаючи права доступу, тимчасові мітки та імена власників файлів та підкаталогів.
Виведення перших ліній текстових файлів
Лістинг 3. Команда less
Обслуговування каталогів з LOG та TMP-файлами
Для обслуговування каталогів, що зберігають LOG- і TMP-файли, які використовуються програмами, що створюють безліч подібних файлів, можна помістити наступні команди в утиліту cron, яка виконується щодня (див. листинг 4).
Лістинг 4. Обслуговування сховищ LOG- та TMP-файлів
Перша команда переглядає всі підкаталоги (-type d), знайдені в каталозі $LOGDIR. Ті каталоги, файли яких змінювалися протягом останніх 24 години ( -mtime +0 ), стискаються ( compress -r <> ) задля економії дискового простору. З метою збільшення вільного місця на диску друга команда видаляє файли ( rm -f <> ), якщо вони не використовуються більше тижня ( -mtime +5 ). Таким чином, задані інтервали часу cron автоматично виконує архівування каталогів.
Копіювання складних дерев каталогів
Буває так, що потрібно скопіювати складні дерева каталогів із одного комп'ютера на інший. При цьому потрібно зберегти права доступу, ідентифікатор користувача, ідентифікатор групи (UID і GID використовуються операційною системою для маркування прав доступу), а індивідуальні користувацькі документи копіювати не потрібно. У такому випадку знову слід використовувати find і cpio (див. листинг 5).
Лістинг 5. Копіювання складного дерева каталогів
Пошук "мертвих" посилань
Для того, щоб знайти посилання, які нікуди не ведуть, слід використовувати інтерпретатор perl з командою find :
Ця команда починає свій обхід з верхнього каталогу ( / ) і виводить усі посилання ( -type l -print ), які, на погляд інтерпретатора perl , нікуди не ведуть ( -nle '-e print' ). Щоб отримати більш вичерпну інформацію про цей спосіб, вивчіть розділ Ресурси, сайт Unix Guru Universe. Якщо потрібно видалити ці файли, можна перенаправити висновок rm -f <> . Perl, як і багато інших мов, що інтерпретуються, можна знайти в різних інструментаріях UNIX.
Пошук та перейменування недрукованих каталогів
Неправильно працююча або шкідлива програма, що працює на UNIX, може створити каталог, чиє ім'я буде включати недруковані символи. Пошук та перейменування таких каталогів дозволяє спростити їх обстеження та видалення. Перше, що треба зробити для досягнення цієї мети: з командою ls слід використовувати прапорець –I, щоб отримати inode. Потім використовуйте find для перетворення номера inode на ім'я файлу, яке може бути змінено командою mv (див. листинг 6).
Лістинг 6. Пошук та перейменування каталогів з недрукованими іменами
Виведення списку порожніх файлів
Щоб вивести всі порожні файли, можна використати таку команду:
Після того, як вони будуть знайдені, їх можна буде видалити, замінивши команду ls на команду rm .
Очевидно, що можливості застосування UNIX-команди find залежать тільки від знань та винахідливості читача.
Висновок
Заплутані нетрі файлової системи UNIX можна дослідити за допомогою команди find. Час, витрачений вивчення цієї команди, на способи їївикористання, не буде витрачено марно. Як було показано в багатьох прикладах, наведених у цій статті, щоб спростити дослідження та керування файловою системою, слід у різний спосіб використовувати команду find .