103.3 Lesson 2
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
103 GNU та команди Unix |
Тема: |
103.3 Основи роботи з файлами |
Урок: |
2 з 2 |
Вступ
Як знайти файли
Коли ви використовуєте свій комп’ютер, кількість і розмір файлів поступово збільшуються. Іноді буває важко знайти певний файл. На щастя, Linux надає команду find
для швидкого пошуку та знаходження файлів. find
використовує такий синтаксис:
find STARTING_PATH OPTIONS EXPRESSION
STARTING_PATH
-
визначає каталог, з якого починається пошук.
OPTIONS
-
контролює поведінку та додає певні критерії для оптимізації процесу пошуку.
EXPRESSION
-
визначає пошуковий запит.
$ find . -name "myfile.txt" ./myfile.txt
Початковим шляхом у цьому випадку є поточний каталог. Параметр -name
вказує, що пошук базується на імені файлу. myfile.txt
- це ім’я файлу для пошуку. Використовуючи шаблони пошуку файлів, не забудьте розмістити вираз у лапках:
$ find /home/frank -name "*.png" /home/frank/Pictures/logo.png /home/frank/screenshot.png
Ця команда знаходить усі файли, які закінчуються на .png
, починаючи з каталогу /home/frank/
і в глибину. Якщо ви не розумієте використання зірочки (*
), це було розглянуто в попередньому уроці.
Використання критеріїв прискорення пошуку
Використовуйте find
, щоб знайти файли на основі типу, розміру або часу. Вказавши один або кілька варіантів, бажані результати можна отримати за менший час.
Перемикання на пошук файлів на основі типу:
-type f
-
пошук файлу.
-type d
-
пошук каталогу.
-type l
-
пошук символічного посилання.
$ find . -type d -name "example"
Ця команда знаходить усі каталоги в поточному каталозі та в глибину, які мають назву example
.
Інші критерії, які можна використовувати з find
:
-name
-
виконує пошук на основі наданого імені.
-iname
-
шукає на основі імені, однак регістр не є важливим (тобто тестовий приклад
myFile
схожий наMYFILE
). -not
-
повертає результати, які не відповідають тестовому прикладу.
-maxdepth N
-
шукає поточний каталог, а також підкаталоги на рівні
N
.
Пошук файлів за часом модифікації
find
також дозволяє фільтрувати ієрархію каталогів на основі того, коли файл був змінений:
$ sudo find / -name "*.conf" -mtime 7 /etc/logrotate.conf
Ця команда шукатиме всі файли у всій файловій системі (початковий шлях — кореневий каталог, тобто /
), які закінчуються символами .conf
і були змінені за останні сім днів. Ця команда потребує підвищених привілеїв для доступу до каталогів, починаючи з основи структури каталогів системи, тому тут використовується sudo
. Аргумент, переданий у mtime
, представляє кількість днів з моменту останньої зміни файлу.
Пошук файлів за розміром
find
також може знаходити файли за розміром. Наприклад, пошук файлів розміром більше ніж 2G у /var
:
$ sudo find /var -size +2G /var/lib/libvirt/images/debian10.qcow2 /var/lib/libvirt/images/rhel8.qcow2
Параметр -size
виводить файли розмірів, що відповідають переданому аргументу. Серед прикладів аргументів:
-size 100b
-
файли, які мають розмір рівно 100 байт.
-size +100k
-
файли, розмір яких перевищує 100 кілобайт.
-size -20M
-
файли розміром менше 20 мегабайт.
-size +2G
-
файли розміром понад 2 гігабайти.
Note
|
Щоб знайти порожні файли, ми можемо використовувати: |
Дії на основі набору результатів
Після завершення пошуку можна виконати дію з результуючим набором за допомогою -exec
:
$ find . -name "*.conf" -exec chmod 644 '{}' \;
Ця команда фільтрує кожен об’єкт у поточному каталозі (.
) і нижче для імен файлів, що закінчуються на .conf
, а потім застосовує команду chmod 644
, щоб змінити дозволи для файлів, які потрапили до результату.
Поки що не турбуйтеся про значення '{}' \;
, оскільки це буде розглянуто пізніше.
Використання grep
для фільтрації файлів на основі вмісту
grep
використовується для пошуку за ключовим словом.
Розглянемо ситуацію, коли ми повинні знайти файли на основі вмісту:
$ find . -type f -exec grep "lpi" '{}' \; -print ./.bash_history Alpine/M helping/M
Ця команда шукатиме кожен об’єкт в поточній ієрархії каталогів (.
), який є файлом (-type f
), а потім виконує команду grep "lpi"
для кожного файлу, який задовольняє умовам. Файли, які відповідають цим умовам, виводяться на екран (-print
). Фігурні дужки ({}
) є заповнювачем для результатів збігу find
. {}
береться в одинарні лапки (`
), щоб уникнути передачі файлів grep
з іменами, що містять спеціальні символи. Команда -exec
закінчується крапкою з комою (;
), яку слід екранувати (\;
), щоб уникнути інтерпретації оболонкою.
Додавання параметра -delete
в кінець виразу видалить усі відповідні файли. Цей параметр слід використовувати, якщо ви впевнені, що результати відповідають лише тим файлам, які ви хочете видалити.
У наведеному нижче прикладі find
знаходить усі файли в ієрархії, починаючи з поточного каталогу, а потім видаляє всі файли, які закінчуються символами .bak
:
$ find . -name "*.bak" -delete
Архівування файлів
Команда tar
(архівування та стиснення)
Команда tar
, скорочення від “tape archive(r)”, використовується для створення tar-архівів шляхом перетворення групи файлів на архів. Архіви створюються для легкого переміщення або резервного копіювання групи файлів. Подумайте про tar
як про інструмент, який створює клей, за допомогою якого можна прикріплювати, групувати та легко переміщувати файли.
tar
також має можливість витягувати архіви tar, відображати список файлів, включених до архіву, а також додавати додаткові файли до існуючого архіву.
Синтаксис команди tar
виглядає наступним чином:
tar [OPERATION_AND_OPTIONS] [ARCHIVE_NAME] [FILE_NAME(S)]
OPERATION
-
Дозволено і необхідно лише один аргумент операції. Операції, які найбільш часто використовувуються:
--create
(-c
)-
Створює новий tar-архів.
--extract
(-x
)-
Розпаковує весь архів або один чи декілька файлів з архіву.
--list
(-t
)-
Виводить список файлів, включених в архів.
OPTIONS
-
Параметри, які найбільш часто використовуються:
--verbose
(-v
)-
Показує файли, які обробляються командою
tar
. --file=archive-name
(-f archive-name
)-
Вказує ім’я файлу архіву.
ARCHIVE_NAME
-
Назва архіву.
FILE_NAME(S)
-
Розділений пробілами список імен файлів, які потрібно витягти. Якщо не надано, розпаковується весь архів.
Створення архіву
Припустимо, що у нас є каталог з назвою stuff
у поточному каталозі, і ми хочемо зберегти його у файлі з назвою archive.tar
. Ми запустимо таку команду:
$ tar -cvf archive.tar stuff stuff/ stuff/service.conf
Ось що насправді означають ці перемикачі:
-c
-
Створити архів.
-v
-
Відображати прогрес у терміналі під час створення архіву, також відомий як режим “verbose”.
-v
завжди необов’язковий у цих командах, але він корисний. -f
-
Дозволяє вказати ім’я файлу архіву.
Загалом для архівування окремого каталогу або файлу в Linux ми використовуємо:
tar -cvf NAME-OF-ARCHIVE.tar /PATH/TO/DIRECTORY-OR-FILE
Note
|
|
Щоб заархівувати кілька каталогів одночасно, ми перераховуємо всі каталоги, розмежовуючи їх пробілом у розділі /PATH/TO/DIRECTORY-OR-FILE
:
$ tar -cvf archive.tar stuff1 stuff2
Ця команда призведе до створення архіву stuff1
і stuff2
в archive.tar
Розпакування архіву
Ми можемо розпакувати архів за допомогою tar
:
$ tar -xvf archive.tar stuff/ stuff/service.conf
Ця команда розпакує вміст archive.tar
до поточного каталогу.
Вона збігається з командою створення архіву, використаною вище, за винятком перемикача -x
, який замінює перемикач -c
.
Щоб розпакувати вміст архіву до певного каталогу, ми використовуємо -C
:
$ tar -xvf archive.tar -C /tmp
Це розпакує вміст archive.tar
до каталогу /tmp
.
$ ls /tmp stuff
Стиснення за допомогою tar
Команда GNU tar
, що входить до складу дистрибутивів Linux, може створити архів .tar
, а потім стиснути його за допомогою стиснення gzip
або bzip2
за одну команду:
$ tar -czvf name-of-archive.tar.gz stuff
Ця команда створить стиснутий файл за допомогою алгоритму gzip
(-z
).
Хоча стиснення gzip
найчастіше використовується для створення файлів .tar.gz
або .tgz
, tar
також підтримує стиснення bzip2
. Це дозволяє створювати стислі файли bzip2
, які часто називають файлами .tar.bz2
, .tar.bz
або .tbz
.
Для цього ми замінюємо -z
для gzip
на -j
для bzip2
:
$ tar -cjvf name-of-archive.tar.bz stuff
Щоб розпакувати файл, ми замінюємо -c
на -x
, де x
означає “extract”:
$ tar -xzvf archive.tar.gz
gzip
швидший, але зазвичай він стискає дані трохи менше, тому ви отримуєте дещо більший файл. bzip2
працює повільніше, але стискає дані трохи більше, тому ви отримуєте дещо менший файл. Загалом, gzip
і bzip2
– це практично одне й те саме, і обидва будуть працювати схоже.
Крім того, ми можемо застосувати стиснення gzip
або bzip2
за допомогою команди gzip
для стиснення gzip
і команди bzip
для стиснення bzip
. Наприклад, щоб застосувати стиснення gzip
, використовуйте:
gzip FILE-TO-COMPRESS
gzip
-
створює стиснений файл з таким же ім’ям, але із закінченням
.gz
. gzip
-
видаляє оригінальні файли після створення стисненого файлу.
Команда bzip2
працює таким же чином.
Щоб розпакувати файли, ми використовуємо gunzip
або bunzip2
залежно від алгоритму, який використовується для стиснення файлу
Команда cpio
cpio
означає “copy in, copy out”. Вона використовується для обробки архівних файлів, таких як файли *.cpio
або *.tar
.
cpio
виконує такі операції:
-
Копіювання файлів до архіву.
-
Вилучення файлів з архіву.
Команда бере список файлів зі стандартного введення (здебільшого виведення команди ls
).
Для створення архіву cpio
ми використовуємо:
$ ls | cpio -o > archive.cpio
Опція -o
вказує cpio
створити вихідні дані. У цьому випадку створюється вихідний файл archive.cpio
. Команда ls
відображає вміст поточного каталогу, який потрібно архівувати.
Щоб розпакувати архів, ми використовуємо:
$ cpio -id < archive.cpio
Для виконання розпакування використовується параметр -i
. Параметр -d
створить папку призначення. Символ <
представляє стандартний вхід. Вхідним файлом, який потрібно розпакувати, є archive.cpio
.
Команда dd
dd
копіює дані з одного місця до іншого. Синтаксис командного рядку dd
відрізняється від синтаксису інших програм Unix, вона використовує синтаксис option=value
для параметрів командного рядка, а не стандартні формати GNU -option value
або --option=value
:
$ dd if=oldfile of=newfile
Ця команда скопіює вміст oldfile
до newfile
, де if=
є вхідним файлом, а of=
посилається на вихідний файл.
Note
|
Команда |
dd
також використовується для зміни даних у верхній/нижній регістр або для запису безпосередньо на блокові пристрої, такі як /dev/sdb
:
$ dd if=oldfile of=newfile conv=ucase
Це призведе до копіювання всього вмісту oldfile
до newfile
але великими літерами.
Наступна команда створить резервну копію всього жорсткого диска, розташованого за адресою /dev/sda
, у файл під назвою backup.dd
:
$ dd if=/dev/sda of=backup.dd bs=4096
Вправи до посібника
-
Розглянемо наступні дані виведення:
$ find /home/frank/Documents/ -type d /home/frank/Documents/ /home/frank/Documents/animal /home/frank/Documents/animal/domestic /home/frank/Documents/animal/wild
-
Які файли вивела ця команда?
-
В якому каталозі починається пошук?
-
-
Користувач хоче стиснути свою папку резервного копіювання. Він використовує таку команду:
$ tar cvf /home/frank/backup.tar.gz /home/frank/dir1
Якого параметра не вистачає для стиснення резервної копії за допомогою алгоритму
gzip
?
Дослідницькі вправи
-
Cистемний адміністратор зобов’язаний виконувати регулярні перевірки, щоб видалити файли великого розміру. Ці файли розташовані в
/var
і закінчуються розширенням.backup
.-
Використайте команду
find
, щоб знайти ці файли: -
Аналіз цих файлів показує, що вони розміром від
100M
до1000M
. Виконайте попередню команду з урахуванням нової інформації, тля того, щоб знайти файли, що містять резервні копії, розміром від100M
до1000M
: -
Нарешті, виконайте цю команду разом з видаленням цих файлів:
-
-
У каталозі
/var
є чотири файли резервних копій:db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Використовуючи команду
tar
, створіть архівний файл з іменемdb-first-quarter-2018.backup.tar
: -
Використовуючи команду
tar
, створіть архів та стисніть його за допомогою командиgzip
. Зверніть увагу, що ім’я файлу має закінчуватися на.gz
:
-
Підсумки
На цьому уроці ви дізналися:
-
Як знайти файли за допомогою
find
. -
Як додати критерії пошуку на основі часу, типу файлу або розміру, додавши аргумент до
find
. -
Як виконати дії над отриманими результатами.
-
Як архівувати, стискати та розпаковувати файли за допомогою
tar
. -
Про обробку архівів за допомогою
cpio
. -
Про копіювання файлів за допомогою
dd
.
Відповіді на вправи до посібника
-
Розглянемо наступні дані виведення:
$ find /home/frank/Documents/ -type d /home/frank/Documents/ /home/frank/Documents/animal /home/frank/Documents/animal/domestic /home/frank/Documents/animal/wild
-
Які файли вивела ця команда?
Каталоги.
-
В якому каталозі починається пошук?
/home/frank/Documents
-
-
Користувач хоче стиснути свою папку резервного копіювання. Він використовує таку команду:
$ tar cvf /home/frank/backup.tar.gz /home/frank/dir1
Якого параметра не вистачає для стиснення резервної копії за допомогою алгоритму
gzip
?Опції
-z
.
Відповіді до дослідницьких вправ
-
Системний адміністратор зобов’язаний виконувати регулярні перевірки, щоб видалити файли великого розміру. Ці файли розташовані в
/var
і закінчуються розширенням.backup
.-
Використайте команду
find
, щоб знайти ці файли:$ find /var -name *.backup
-
Аналіз цих файлів показує, що вони розміром від
100M
до1000M
. Виконайте попередню команду з урахуванням нової інформації, тля того, щоб знайти файли, що містять резервні копії, розміром від100M
до1000M
:$ find /var -name *.backup -size +100M -size -1000M
*
$ find /var -name *.backup -size +100M -size -1000M -delete
-
-
У каталозі
/var
є чотири файли резервних копій:db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Використовуючи команду
tar
, створіть архівний файл з іменемdb-first-quarter-2018.backup.tar
:$ tar -cvf db-first-quarter-2018.backup.tar db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Використовуючи команду
tar
, створіть архів та стисніть його за допомогою командиgzip
. Зверніть увагу, що ім’я файлу має закінчуватися на.gz
:$ tar -zcvf db-first-quarter-2018.backup.tar.gz db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-