Команда Tar в Linux: Tar CVF та Tar XVF пояснюються на прикладах команд

Ім'я tar, за більшістю відомостей, скорочене для стрічкового архіву . Розглянуті "стрічки" - це всі ті магнітні накопичувачі, які були популярні ще в 1950-х роках.

Це говорить про те, що tarінструмент може бути дещо застарілим і вже минув. Але правда полягає в тому, що за всі роки та всі сейсмічні зміни в світі ІТ tarнічого не втратило своєї сили та цінності.

У цій статті, на основі вмісту з моєї книги Linux in Action, я збираюся показати вам основи створення, стиснення та відновлення архіву tar. Почнемо спочатку.

Створення архівів

Цей приклад візьме всі файли та каталоги у поточному робочому каталозі та під ним, а також створить архівний файл, який я розумно назвав archivename.tar.

Тут я використовую три аргументи після команди tar:

  • the ctar tar для створення нового архіву,
  • v встановлює виведення на екран багатослівного, тому я отримуватиму оновлення та
  • f вказує на ім'я файлу, яке я хотів би передати в архів.

Це *те, що каже tarвключати всі файли та локальні каталоги рекурсивно.

$ tar cvf archivename.tar * file1 file2 file3 directory1 directory1/morestuff directory1/morestuff/file100 directory1/morestuff/file101 

Команда tar ніколи не переміщуватиме і не видалятиме жоден оригінальний каталог і файли, якими ви його зберігаєте - вона робить лише заархівовані копії.

Також слід зауважити, що використання крапки (.) Замість зірочки (*) у попередній команді включало б навіть приховані файли (імена яких починаються з крапки) в архіві.

Якщо ви стежите за цим на своєму комп’ютері (як ви однозначно повинні), то ви побачите новий файл з назвою archivename.tar. Розширення імені файлу .tar не є необхідним, але це завжди гарна ідея чітко повідомляти про призначення файлу якомога більшою кількістю способів.

Витягти архів для відновлення файлів дуже просто: просто використовуйте xvfзамість cvf. Це, у прикладі, збереже нові копії оригінальних файлів та каталогів у поточному місці.

$ tar xvf archivename.tar file1 file2 file3 directory1 directory1/morestuff directory1/morestuff/file100 directory1/morestuff/file101 

Звичайно, ви також можете запросити tar відправити витягнуті файли в інше місце, використовуючи -Cаргумент, а потім цільове розташування:

$ tar xvf archivename.tar -C /home/mydata/oldfiles/ 

Ви не завжди хочете включати всі файли до дерева каталогів у своєму архіві.

Припустимо, ви створили кілька відео, але вони наразі зберігаються в каталогах разом із усіма видами графічних, аудіо- та текстових файлів (містять ваші примітки). Єдиними файлами, які потрібно створити для резервної копії, є кінцеві відеокліпи із розширенням імені файлу .mp4.

Ось як це зробити:

$ tar cvf archivename.tar *.mp4 

Це чудово. Але ці відеофайли величезні. Чи не було б непогано зробити цей архів трохи меншим за допомогою стиснення?

Не кажи більше ні слова! Просто запустіть попередню команду з zаргументом (zip). Це скаже програмі gzip стиснути архів.

Якщо ви хочете дотримуватися домовленостей, ви можете також додати .gzрозширення на додаток до .tarвже наявного. Запам’ятайте: ясність.

Ось як це могло б розігратися:

$ tar czvf archivename.tar.gz *.mp4 

Якщо ви спробуєте це на власних файлах .mp4, а потім запустите ls -l у каталозі, що містить нові архіви, ви можете помітити, що .tar.gzфайл не набагато менший за .tarфайл, можливо , приблизно на 10%. Що з цим?

Що ж, .mp4формат файлу сам стискається, тому gzip має набагато менше місця для виконання своїх дій.

Оскільки tar в повній мірі знає своє середовище Linux, ви можете використовувати його для вибору файлів та каталогів, які працюють поза вашим поточним робочим каталогом. Цей приклад додає всі .mp4файли в /home/myuser/Videos/каталозі:

$ tar czvf archivename.tar.gz /home/myuser/Videos/*.mp4 

Оскільки архівні файли можуть стати великими, іноді може мати сенс розбити їх на кілька менших файлів, перенести в новий будинок, а потім відтворити оригінальний файл на іншому кінці. Інструмент для розколу зроблений для цієї мети.

У цьому прикладі -bвказує Linux розділити файл archivename.tar.gz на частини розміром 1 ГБ. Потім операція називає кожну з частин - archivename.tar.gz.partaa, archivename.tar.gz.partab, archivename.tar.gz.partac тощо:

$ split -b 1G archivename.tar.gz "archivename.tar.gz.part" 

З іншого боку, ви заново створюєте архів, читаючи кожну з частин послідовно (cat archivename.tar.gz.part *), а потім перенаправляєте висновок у новий файл з назвою archivename.tar.gz:

$ cat archivename.tar.gz.part* > archivename.tar.gz 

Потокове передавання архівів файлової системи

Ось де починаються хороші речі. Я покажу вам, як створити архівний образ робочої інсталяції Linux і передати його у віддалене місце зберігання - все в межах однієї команди. Ось команда:

# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz" 

Замість того, щоб намагатися пояснити все це відразу, я буду використовувати менші приклади, щоб дослідити це поштучно.

Давайте створимо архів вмісту каталогу, який називається importantstuff, який наповнений, ну, дійсно важливими речами:

$ tar czvf - importantstuff/ | ssh [email protected] "cat > /home/username/myfiles.tar.gz" importantstuff/filename1 importantstuff/filename2 [...] [email protected]'s password: 

Дозвольте пояснити цей приклад. Замість того, щоб вводити ім’я архіву відразу після аргументів команди (так, як ви це робили до цього часу), я використав тире (czvf -).

Тире виводить дані на стандартний вивід. Це дозволяє вам повернути деталі імені файлу архіву назад до кінця команди і повідомляє tar очікувати замість цього вихідний вміст для архіву.

Потім я передав (|) неіменований, стислий архів у логін ssh на віддаленому сервері, де мене попросили ввести пароль.

Потім команда, укладена в лапки, виконала cat проти архівного потоку даних, який записав вміст потоку у файл myfiles.tar.gz у моєму домашньому каталозі на віддаленому хості.

Однією з переваг створення архівів таким чином є те, що ви уникаєте накладних витрат на середній крок. Не потрібно навіть тимчасово зберігати копію архіву на локальній машині. Уявіть собі резервну копію інсталяції, яка заповнює 110 ГБ із 128 ГБ доступного місця. Куди піде архів?

Це був лише каталог файлів. Припустимо, вам потрібно створити резервну копію активної ОС Linux на USB-накопичувачі, щоб ви могли перенести її на окрему машину та опустити на основний диск цієї машини.

Якщо припустити, що на другій машині вже встановлена ​​нова версія тієї ж версії Linux, наступна операція копіювання / вставлення створить точну копію першої.

ПРИМІТКА. Це не працюватиме на цільовому диску, на якому ще не встановлена ​​файлова система Linux. Щоб вирішити цю ситуацію, вам потрібно використовувати dd.

The next example creates a compressed archive on the USB drive known as /dev/sdc1.

The --one-file-system argument excludes all data from any file system besides the current one. This means that pseudo partitions like /sys/ and /dev/ won’t be added to the archive. If there are other partitions that you want to include (as you’ll do for /usr/ and /var/ in this example), then they should be explicitly added.

Finally, you can exclude data from the current file system using the --exclude argument:

# tar czvf /dev/sdc1/workstation-backup-Apr-10.tar.gz \ --one-file-system \ / /usr /var \ --exclude=/home/andy/ 

Now let’s go back to that full-service command example. Using what you’ve already learned, archive all the important directories of a file system and copy the archive file to a USB drive. It should make sense to you now:

# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz" 

There's much more administration goodness in the form of books, courses, and articles available at my bootstrap-it.com.