40 найкращих прикладів команди Find у Linux

Зміст

Команда `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, скористайтеся цим онлайн курсом.