<Попередній | зміст | Наступна>
дьоготь
У Unix-подібному світі програмного забезпечення, дьоготь Програма є класичним інструментом для архівування файлів.
Його назва, скорочення від стрічковий архів, розкриває свої коріння як інструмент для створення резервних стрічок. Хоча він все ще використовується для цієї традиційної задачі, він однаково вправний і на інших пристроях зберігання даних. Ми часто бачимо імена файлів, які закінчуються розширенням .Тар or .tgz, які вказують на «звичайний» tar-архів і архів з gzip відповідно. Архів tar може складатися з групи окремих файлів, однієї або кількох ієрархій каталогів або їх суміші. Синтаксис команди працює так:
дьоготь режим[опції] ім'я шляху...
де режим є одним із наступних режимів роботи (тут показано лише частковий список; див дьоготь man сторінка для повного списку):
Таблиця 18-2: Режими tar
Опис режиму
Опис режиму
c Створіть архів зі списку файлів та/або каталогів.
x Розпакуйте архів.
r Додати вказані шляхи до кінця архіву.
t Перелік вмісту архіву.
tar використовує трохи дивний спосіб вираження параметрів, тому нам знадобиться кілька прикладів, щоб показати, як це працює. Спочатку давайте відтворимо наш ігровий майданчик з попередньої глави:
[me@linuxbox ~]$ mkdir -p ігровий майданчик/dir-{001..100}
[me@linuxbox ~]$ торкніться playground/dir-{001..100}/file-{A..Z}
[me@linuxbox ~]$ mkdir -p ігровий майданчик/dir-{001..100}
[me@linuxbox ~]$ торкніться playground/dir-{001..100}/file-{A..Z}
Далі створимо tar-архів всього дитячого майданчика:
[me@linuxbox ~]$ tar cf playground.tar playground
[me@linuxbox ~]$ tar cf playground.tar playground
Ця команда створює tar-архів з іменем дитячий майданчик.тар який містить всю ієрархію каталогів playground. Ми бачимо, що режим і f параметр, який використовується для вказівки назви дьоготь архів, можуть бути з’єднані разом і не потребують переднього тире. Зауважте, однак, що режим завжди потрібно вказувати першим, перед будь-яким іншим параметром.
Щоб перерахувати вміст архіву, ми можемо зробити так:
[me@linuxbox ~]$ tar tf playground.tar
[me@linuxbox ~]$ tar tf playground.tar
Для більш детального переліку ми можемо додати v (дослівний) варіант:
[me@linuxbox ~]$ tar tvf playground.tar
[me@linuxbox ~]$ tar tvf playground.tar
Тепер давайте витягнемо дитячий майданчик на нове місце. Ми зробимо це, створивши новий каталог під назвою Foo, змінивши каталог і розпакувавши tar-архів:
[me@linuxbox ~]$ mkdir foo
[me@linuxbox ~]$ компакт-диск foo
[me@linuxbox foo]$ tar xf ../playground.tar
[me@linuxbox foo]$ ls
дитячий майданчик
[me@linuxbox ~]$ mkdir foo
[me@linuxbox ~]$ компакт-диск foo
[me@linuxbox foo]$ tar xf ../playground.tar
[me@linuxbox foo]$ ls
дитячий майданчик
Якщо ми вивчимо зміст ~/foo/playground, ми бачимо, що архів було успішно встановлено, створюючи точне відтворення оригінальних файлів. Однак є одне застереження: якщо ви не працюєте як суперкористувач, файли та каталоги, витягнуті з архівів, переходять у власність користувача, який виконує відновлення, а не початкового власника.
Ще одна цікава поведінка дьоготь це спосіб обробки імен шляхів в архівах. За замовчуванням для імен шляхів є відносними, а не абсолютними. дьоготь робить це, просто видаляючи будь-яку провідну косу риску з імені шляху під час створення архіву. Щоб продемонструвати, ми знову створимо наш архів, цього разу вказавши абсолютний шлях:
[me@linuxbox foo]$ cd
[me@linuxbox ~]$ tar cf playground2.tar ~/playground
[me@linuxbox foo]$ cd
[me@linuxbox ~]$ tar cf playground2.tar ~/playground
Пам'ятайте, ~/ігровий майданчик розшириться в /дома/я/ігровий майданчик коли ми натискаємо клавішу enter, ми отримаємо абсолютний шлях для нашої демонстрації. Далі ми розпакуємо архів, як і раніше, і подивимося, що відбувається:
[me@linuxbox ~]$ компакт-диск foo
[me@linuxbox foo]$ tar xf ../playground2.tar
[me@linuxbox foo]$ ls
домашній ігровий майданчик [me@linuxbox foo]$ Я вдома
[me@linuxbox ~]$ компакт-диск foo
[me@linuxbox foo]$ tar xf ../playground2.tar
[me@linuxbox foo]$ ls
домашній ігровий майданчик [me@linuxbox foo]$ Я вдома
me
[me@linuxbox foo]$ Я вдома/я
дитячий майданчик
me
[me@linuxbox foo]$ Я вдома/я
дитячий майданчик
Тут ми бачимо, що коли ми розпакували наш другий архів, він знову створив каталог дім/я/ігровий майданчик відносно нашого поточного робочого каталогу, ~/foo, не відносно кореневого каталогу, як це було б у випадку з абсолютним ім'ям шляху. Це може здатися дивним способом його роботи, але насправді він більш корисний, оскільки дозволяє нам витягувати архіви в будь-яке місце, а не змушувати витягувати їх у вихідні місця. Повторення вправи з включенням багатослівного варіанту (v) дасть більш чітке уявлення про те, що відбувається.
Давайте розглянемо гіпотетичний, але практичний приклад дьоготь в дії. Уявіть, що ми хочемо скопіювати домашній каталог та його вміст з однієї системи в іншу, і у нас є великий жорсткий диск USB, який ми можемо використовувати для передачі. У нашій сучасній системі Linux диск «автоматично» вмонтовано в / ЗМІ каталог. Давайте також уявімо, що диск має назву тому BigDisk коли ми його прикріплюємо. Щоб створити архів tar, ми можемо зробити наступне:
[me@linuxbox ~]$ sudo tar cf /media/BigDisk/home.tar /home
[me@linuxbox ~]$ sudo tar cf /media/BigDisk/home.tar /home
Після того як файл tar буде записаний, ми відмонтуємо диск і підключаємо його до другого комп’ютера. Знову ж таки, він встановлений на /media/BigDisk. Щоб розпакувати архів, робимо так:
[me@linuxbox2 ~]$ кд /
[me@linuxbox2 /]$ sudo tar xf /media/BigDisk/home.tar
[me@linuxbox2 ~]$ кд /
[me@linuxbox2 /]$ sudo tar xf /media/BigDisk/home.tar
Тут важливо бачити те, що спочатку ми повинні змінити каталог на /, так що витягування відбувається відносно кореневого каталогу, оскільки всі імена шляху в архіві відносні.
При розпакуванні архіву можна обмежити те, що витягується з архіву. Наприклад, якщо ми хочемо витягти один файл з архіву, це можна зробити так:
tar xf archive.tar шлях
tar xf archive.tar шлях
Додавши кінець ім'я шляху на команду, дьоготь відновить лише вказаний файл. Можна вказати кілька шляхів. Зверніть увагу, що ім’я шляху має бути повним, точним відношенням
тивне ім’я шляху, яке зберігається в архіві. Під час визначення шляхів підстановки зазвичай не підтримуються; однак версія GNU дьоготь (це версія, яка найчастіше зустрічається в дистрибутивах Linux) підтримує їх разом із -- підстановкові знаки варіант. Ось приклад із використанням нашого попереднього дитячий майданчик.тар Файл:
[me@linuxbox ~]$ компакт-диск foo
[me@linuxbox foo]$ tar xf ../playground2.tar --wildcards 'home/me/pla yground/dir-*/file-A'
[me@linuxbox ~]$ компакт-диск foo
[me@linuxbox foo]$ tar xf ../playground2.tar --wildcards 'home/me/pla yground/dir-*/file-A'
Ця команда витягне лише файли, що відповідають вказаному шляху, включаючи підстановку режисер-*.
tar часто використовується разом із find для створення архівів. У цьому прикладі ми будемо використовувати find для створення набору файлів для включення в архів:
[me@linuxbox ~]$ знайти playground -name 'file-A' -exec tar rf playground.tar '{}' '+'
[me@linuxbox ~]$ знайти playground -name 'file-A' -exec tar rf playground.tar '{}' '+'
Тут ми використовуємо знаходити щоб зіставити всі файли в дитячий майданчик названий файл-А а потім, використовуючи Exec- дії, ми закликаємо дьоготь в режимі додавання (r), щоб додати відповідні файли до архіву дитячий майданчик.тар.
використання дьоготь з знаходити є хорошим способом створення додаткові резервні копії дерева каталогів або всієї системи. З допомогою знаходити щоб узгодити файли, новіші за файл позначки часу, ми можемо створити архів, який містить лише файли, новіші, ніж останній архів, припускаючи, що файл позначки часу оновлюється відразу після створення кожного архіву.
tar також може використовувати як стандартний введення, так і вихід. Ось вичерпний приклад:
[me@linuxbox foo]$ cd
[me@linuxbox ~]$ знайти дитячий майданчик -назва 'файл-A' | tar cf - --files- from=- | gzip > playground.tgz
[me@linuxbox foo]$ cd
[me@linuxbox ~]$ знайти дитячий майданчик -назва 'файл-A' | tar cf - --files- from=- | gzip > playground.tgz
У цьому прикладі ми використали знаходити програма для створення списку відповідних файлів і передачі їх дьоготь. Якщо вказано ім’я файлу «-», воно означає стандартний введення або вихід, якщо потрібно. (До речі, ця умова використання «-» для позначення стандартного введення/виводу також використовується в ряді інших програм). The --файли-від параметр (який також може бути вказаний як -T) причини дьоготь скоріше читати його список імен шляхів із файлу
ніж командний рядок. Нарешті, архів, створений дьоготь підводиться до gzip щоб створити стиснутий архів playground.tgz, .tgz розширення — це звичайне розширення, яке надається для стиснутих gzip файлів tar. Розширення .tar.gz також іноді використовується.
Поки ми використовували gzip зовнішня програма для створення нашого стисненого архіву, сучасних версій GNU дьоготь підтримує стиснення gzip і bzip2 безпосередньо за допомогою файлу z та j варіанти, відповідно. Використовуючи наш попередній приклад як основу, ми можемо спростити його таким чином:
[me@linuxbox ~]$ знайти дитячий майданчик -назва 'файл-A' | tar czf playground.tgz -T -
[me@linuxbox ~]$ знайти дитячий майданчик -назва 'файл-A' | tar czf playground.tgz -T -
Якби ми хотіли замість цього створити стиснений архів bzip2, ми могли б зробити це:
[me@linuxbox ~]$ знайти дитячий майданчик -назва 'файл-A' | tar cjf playground.tbz -T -
[me@linuxbox ~]$ знайти дитячий майданчик -назва 'файл-A' | tar cjf playground.tbz -T -
Просто змінивши параметр стиснення з z до j (і змінюючи розширення вихідного файлу на .tbz щоб позначити стиснутий файл bzip2), ми ввімкнули стиснення bzip2.
Ще одне цікаве використання стандартного введення та виводу з дьоготь Команда передбачає передачу файлів між системами через мережу. Уявіть собі, що у нас є дві машини, які оснащені Unix-подібною системою дьоготь та SSH. У такому випадку ми могли б передати каталог з віддаленої системи (named дистанційна система для цього прикладу) до нашої локальної системи:
[me@linuxbox ~]$ mkdir віддалений матеріал
[me@linuxbox ~]$ компакт-диск дистанційний
[me@linuxbox remote-stuff]$ ssh remote-sys 'tar cf - Документи' | tar xf -
Пароль me@remote-sys: [me@linuxbox remote-stuff]$ ls документи
[me@linuxbox ~]$ mkdir віддалений матеріал
[me@linuxbox ~]$ компакт-диск дистанційний
[me@linuxbox remote-stuff]$ ssh remote-sys 'tar cf - Документи' | tar xf -
Пароль me@remote-sys: [me@linuxbox remote-stuff]$ ls документи
Тут ми змогли скопіювати каталог з назвою документи з віддаленої системи віддалена-сис до каталогу всередині каталогу з ім дистанційні речі на місцевій системі. Як ми це зробили? Спочатку ми запустили дьоготь програму на віддаленій системі за допомогою SSH. Ви це згадаєте SSH дозволяє нам дистанційно виконувати програму на комп’ютері в мережі та «бачити» результати в локальній системі - стандартний вихід про-
отриманий на віддаленій системі надсилається в локальну систему для перегляду. Ми можемо скористатися цим, маючи дьоготь створити архів ( c режим) і відправити його на стандартний вихід, а не у файл ( f опція з аргументом тире), таким чином переміщаючи архів через зашифрований тунель, наданий SSH до місцевої системи. На локальній системі ми виконуємо дьоготь і попросіть його розширити архів ( x режим), що подається зі стандартного введення (знову ж таки, f варіант з аргументом тире).