Команда `find` у Linux є потужним інструментом, що дозволяє системним адміністраторам здійснювати пошук і керування файлами та каталогами, використовуючи різноманітні критерії. За її допомогою можна знаходити елементи за їх назвою, типом, розширенням, розміром, правами доступу та іншими параметрами.
Крім простого пошуку, комбінуючи команду `find` з іншими інструментами, можна виконувати різноманітні дії з отриманими результатами. Зокрема, використання параметра `-exec` дає можливість запускати зовнішні команди, виконуючи операції, такі як копіювання, переміщення, видалення або зміна дозволів для файлів, що задовольняють заданим умовам, наприклад розміру чи імені.
У цьому посібнику ми почнемо з пояснення основ використання команди `find` на практичних прикладах. Ви навчитеся знаходити файли та каталоги. Потім ми розглянемо, як застосовувати параметр `-exec` для виконання дій над файлами та каталогами, залежно від їхніх атрибутів, таких як розмір чи права доступу.
Загальна структура команди `find` виглядає наступним чином:
find {шлях} {критерії_пошуку} {дія}
Де:
- `шлях` – вказує на каталог, у якому буде проводитися пошук.
- `критерії_пошуку` – задають параметри для пошуку файлів або каталогів (наприклад, назва).
- `дія` – визначає операцію, яку необхідно виконати з результатами пошуку (наприклад, копіювання, видалення).
У цьому посібнику ми детально розберемо пошук файлів і каталогів, що відповідають заданим умовам. Також ви дізнаєтеся, як виконувати різні операції з файлами та каталогами, знайденими за допомогою команди `find`. Матеріали посібника базуються на дистрибутиві Ubuntu, але їх можна застосовувати до більшості дистрибутивів і версій Linux.
Основні принципи пошуку файлів та каталогів
Пошук файлів за точним ім’ям або розширенням
Для пошуку конкретного файлу, необхідно запустити команду з кореневого каталогу (`/`), вказавши точну назву файлу, який ви шукаєте:
find . -name file22.txt
Вивід:
./test/file22.txt ./sales/file22.txt
Зверніть увагу, що у виводі відображається повний шлях до файлу. Це особливо важливо, якщо ви не знаєте точне розташування файлу або якщо він знаходиться у кількох місцях.
Можна також шукати файл в іншому каталозі, перебуваючи в поточному. Для цього необхідно вказати шлях до цільового каталогу:
find ./test -name file22.txt
Пошук файлів в іншому каталозі, що починаються з певних літер
Наприклад, для пошуку всіх файлів, назви яких починаються з “file” в каталозі “test”, використовуйте:
find ./test -name file*
Вивід:
./test/file22.txt ./test/file30.doc ./test/file1.txt ./test/file5,doc
Пошук файлів за їхнім розширенням
Щоб знайти всі файли з певним розширенням, вкажіть розширення у команді:
find . -name *.txt
Вивід:
./test/subtest/subfil.txt ./test/file22.txt ./test/file1.txt ./home1/files32.txt ./home2/file22.txt ./qa/tags.txt
Пошук файлів і каталогів за спільним шаблоном назви
Для пошуку файлів і каталогів, назви яких починаються з “qa”, застосуйте наступну команду:
find ./ -name "qa*"
Вивід:
./test/qatree.pdf ./test/qa.txt ./home/qa
Команда повертає як файли, так і каталоги, що відповідають шаблону. Щоб обмежити пошук лише файлами або каталогами, необхідно вказати це додатково.
Пошук лише файлів або лише каталогів
Для пошуку лише файлів використовуйте перемикач `-type f`:
find ./ -type f -name "qa*"
Вивід:
./test/qatree.pdf ./test/qa.txt
Для пошуку лише каталогів використовуйте перемикач `-type d`:
find ./ -type d -name "qa*"
Вивід:
./home/qa
Пошук без урахування регістру
Пошук за допомогою `-name` чутливий до регістру. Для пошуку без урахування регістру використовуйте параметр `-iname`:
find ./ -iname "qa*"
Вивід:
./test/qatree.pdf ./test/qa.txt ./test/QAtest.txt ./home/qa
Пошук файлів у кількох каталогах одночасно
Для пошуку файлів у різних каталогах, вкажіть їхні шляхи в команді:
find ./test ./numeric -name file22.txt -type f
Вивід:
./test/file22.txt /root/numeric/file22.txt
Пошук файлів із різними розширеннями
Можна одночасно шукати файли з кількома розширеннями, використовуючи оператор `-o` (або):
find . -type f \( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" \)
Вивід:
./test/subtest/subfil.txt ./test/qatree.pdf ./test/file22.txt ./test/qa.txt ./test/file30.doc ./books/acro.pdf ./data1/FILE22.txt ./docs/files32.txt
Пошук файлів, що містять певний текст
Щоб знайти файли, що містять певну фразу, використовуйте команду `grep` в поєднанні з `find`:
find / -type f -exec grep -l -i "hyperconvergence" {} ;
Вивід:
/root/numeric/hci /root/HCIP
Опція `-i` дозволяє ігнорувати регістр. Для пошуку в певному каталозі, вкажіть шлях:
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
Вивід:
./numeric/hci
Пошук файлів і каталогів за розміром
Можна шукати файли, що є більшими, меншими або рівними певному розміру. Розміри можна вказувати в байтах (`c`), кілобайтах (`k`), мегабайтах (`M`) і гігабайтах (`G`).
Пошук файлів заданого розміру
Для пошуку файлів розміром 30 мегабайт:
find / -size 30M
Пошук файлів, розмір яких перевищує вказаний
find / -size +2M
Вивід:
./Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f4143050577a9c
Пошук файлів менших за вказаний розмір
find . -type f -size -10M
Пошук файлів у певному діапазоні розмірів
find / -size +100M -size -200M
Пошук каталогів, розмір яких перевищує вказаний
find / -type d -size +20k
Пошук порожніх файлів і каталогів
Для пошуку порожніх файлів:
find ./ -type f -size 0
або
find ./ -type f --empty
Для пошуку порожніх каталогів:
find ./ -type d --empty
Пошук файлів за часом останньої модифікації
Для пошуку файлів, старших за n днів:
find /path/ -type f -name '*.txt' -mtime +8
Для пошуку файлів, змінених протягом останніх n годин:
find . -mtime -17 -type f
Для пошуку каталогів, змінених протягом останніх n днів:
find . -mtime -10 -type d
Пошук файлів за часом доступу або модифікації
Щоб переглянути файли, до яких не було доступу протягом останніх 10 днів у домашньому каталозі:
find /home -atime +10
Доступ до файлів отримано рівно 10 днів тому:
find /home -atime 10
Доступ протягом останніх 10 днів:
find /home -atime -10
Пошук файлів, змінених протягом останніх n днів
find /home -mtime -10
Пошук файлів, змінених протягом певного проміжку часу
find /home -type f -mtime +6 -mtime -15
Файли та каталоги, доступ до яких здійснювався протягом останніх n хвилин
Для пошуку файлів, до яких було отримано доступ протягом останніх 10 хвилин:
find . -amin -10 -type f
Вивід:
./.bash_history ./[email protected]:~#
Для пошуку каталогів, доступ до яких було отримано протягом останніх 10 хвилин:
find . -amin -10 -type d
Пошук файлів за їхніми дозволами
Синтаксис:
find -perm mode
`mode` – це числовий (наприклад, `644`, `777`) або символьний (`u=x`, `a=r+x`) запис дозволів.
Режими можна вказувати трьома способами:
- Без префікса для точного збігу.
- З префіксом `-` для пошуку файлів з принаймні вказаними дозволами.
- З префіксом `/` для пошуку файлів, де принаймні один з користувачів (власник, група, інші) має вказані дозволи.
Пошук файлів з дозволами 777
find . -perm 777
Вивід:
./file1
Пошук файлів з принаймні вказаними дозволами
find . -perm -766
Вивід:
./file2 ./file1
Пошук файлів, доступних для запису
find . -perm /222
Вивід:
. ./file2 ./file3 ./file1
Для пошуку файлів, де власник і група мають права на запис:
find . -perm -220
Вивід:
./file2 ./file1
Пошук файлів, що належать певному користувачу
find /home -user jack
Вивід:
/home/jack /home/jack/examples.desktop /home/jack/.gnupg /home/jack/.gnupg/private-keys-v1.d /home/jack/ans.cgi
Пошук файлів певного типу, що належать певному користувачу
find /home -user jack -iname "*.txt"
Вивід:
/home/jack/docs/file32.txt
Пошук і виведення файлів з їхніми дозволами
find . -name "*.conf" -exec ls -l {} ;
Вивід:
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
Дії з результатами пошуку
У цьому розділі ми розглянемо, як виконувати різні дії з файлами, знайденими за допомогою команди `find`.
Зміна дозволів файлів
Наприклад, щоб змінити дозволи для всіх PHP-файлів на `755`:
find ver -name "*.php" -type f -exec chmod 755 {} ;
Зміна дозволів файлів і каталогів
Щоб знайти файли з дозволами `644` і змінити їх на `655`:
find . -type f -perm 644 -exec chmod 655 {} ;
Щоб знайти каталоги з дозволами `644` і змінити їх на `755`:
find . -type d -perm 644 -exec chmod 755 {} ;
Копіювання файлів або каталогів
Щоб скопіювати файл `file22.txt` у каталог `~/tmp/images`:
find . -iname file22.txt -exec cp {} ~/tmp/images ;
Щоб скопіювати всі файли з розширенням `jpg` до каталогу `~/tmp/images`:
find . -iname '*.jpg' -exec cp {} ~/tmp/images ;
Копіювання файлу в кілька каталогів
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
Переміщення файлів
Щоб перемістити файл `universal.php` до каталогу `~/numeric/`:
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
Щоб перемістити всі файли з розширенням `php` до каталогу `~/folder/`:
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
Переміщення файлів за спільним шаблоном
find . -type f -name uni*.* -exec mv {} ~/unifiles/ ;
Переміщення файлів на основі їхнього віку
find /path/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
Видалення файлів і каталогів
Синтаксис для видалення:
find . -type f -name "файл_для_видалення" -exec rm -f {} ;
для файлів або
find . -type d -name "каталог_для_видалення" -exec rm -rf {} ;
для каталогів.
Видалення файлів за шаблоном
find . -type f -name "til*" -exec rm {} ;
Видалення каталогів за шаблоном
find . -type d -name "til*" -exec rm {} ;
Видалення і файлів, і каталогів
find . -name "til*" -exec rm -rf {} ;
Видалення файлів за розширенням
find . -type f -name "*.txt" -exec rm -f {} ;
Щоб підтвердити видалення кожного файлу, використовуйте опцію `-i`:
find . -type f -name "*.txt" -exec rm -i {} ;
Видалення файлів, старших за n днів
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
Видалення каталогів
find . -type d -name dir22 -exec rm -rf {} ;
або без урахування регістру:
find . -type d -iname Dir22 -exec rm -rf {} ;
Для підтвердження:
find . -type d -iname Dir22 -exec rm -rf -i {} ;
Видалення порожніх файлів
find ./ -type f -size 0 -exec rm -f {} ;
або
find ./ -type f -size 0 | xargs rm -f
або
find ./ -type f -size 0 --delete
Видалення порожніх каталогів
find ./ -type d -empty -exec rmdir {} ;
або
find ./ -type d -empty --delete
Пам’ятайте, що видалення важливих файлів може призвести до збоїв в роботі системи. Тому рекомендується використовувати команду `find` з обережністю, завжди перевіряючи, які файли ви збираєтеся видалити, та робити резервні копії.
Що далі?
Спробуйте ці команди у своєму тестовому середовищі. Подумайте, як можна використовувати їх для автоматизації рутинних задач, наприклад, очищення файлової системи за допомогою Crontab. А для глибшого вивчення Linux, скористайтеся цим онлайн курсом.