70

Я почти уверен, что я не единственный, кто сталкивается со следующей проблемой: каждый раз, когда мне нужно распаковать файл в * nix, я не могу вспомнить все параметры и заканчиваю поиском в Google, что удивительно, учитывая, как часто мне нужно сделай это.

У вас есть хорошая шпаргалка? Или как насчет мнемоники для всех этих неприятных переключателей в tar?

Я делаю эту статью вики, чтобы мы могли создать хороший шпаргалку здесь.

О, и о страницах руководства: есть одна вещь, для которой они не полезны, это для выяснения, как распаковать файл.

16 ответов16

63

Или как насчет использования оболочки с расширенными возможностями завершения (например, zsh или свежей версией bash), которая дополнит ваши параметры всесторонней помощью? :))

Что касается tar: просто посмотрите на клавиатуру "qwerty". Есть буквы "zxcvf" рядом друг с другом. Вам нужны либо «tar czvf file.tar.gz файлы», либо «tar xzvf file.tar.gz».

39

Обзор опций Tar

Вы можете редактировать это, чтобы добавить больше эзотерических переключателей, но вот основы:

  • x - извлечь файлы
  • c - создать архив
  • t - список файлов
  • v - подробный (список файлов по мере их обработки)
  • j - использовать сжатие bz2
  • z - использовать сжатие gz
  • f - читать или записывать файлы на диск

Примеры

Распакуйте файл tar.gz: tar zxf tarball.tar.gz

Распакуйте файл tar.bz2: tar jxf tarball.tar.bz2

Создайте файл tar.gz: tar zcvf tarvall.tar.gz mydir/*

22

Есть небольшой скрипт на Perl под названием "unp".

unp filename.tar.gz

... и это все извлекает. Работает с любым сжатым файлом, если у вас есть нужные двоичные файлы. И ты просто забываешь о синтаксисе или любом другом дерьме. Проверьте репозитории вашего дистрибутива Linux. Это должно быть там (по крайней мере, в Arch, Debian и Ubuntu).

6

Просто введите tar --help и вот ваш чит-лист.

6

Действительно при частом использовании я делаю различие между извлечением (x) данных и сжатием (c) данных:

Извлекать:

tar xzf data.tgz

Сжать:

tar czf data.tgz

Кроме того, вы можете добавить две функции в ваш .bashrc:

function extract () {     
        if ($# -ne 1); then
                echo "Usage: $0  `<compressed archive>"`
                exit 1
        fi
        tar xzf $1
}

function compress () {
        if ($# -ne 2); then
                echo "Usage: $0 `<compressed archive> <files|directories>"`
                exit 1
        fi
        tar czf $1 $2
}

Есть еще одна приятная функция извлечения, она определяет расширение вашего сжатого файла и делает всю работу за вас:

extract () {
   if [ -f $1 ] ; then
       case $1 in
           *.tar.bz2)   tar xvjf $1    ;;
           *.tar.gz)    tar xvzf $1    ;;
           *.bz2)       bunzip2 $1     ;;
           *.rar)       unrar x $1       ;;
           *.gz)        gunzip $1      ;;
           *.tar)       tar xvf $1     ;;
           *.tbz2)      tar xvjf $1    ;;
           *.tgz)       tar xvzf $1    ;;
           *.zip)       unzip $1       ;;
           *.Z)         uncompress $1  ;;
           *.7z)        7z x $1        ;;
           *)           echo "don't know how to extract '$1'..." ;;
       esac
   else
       echo "'$1' is not a valid file!"
   fi
 }
3

Если у вас возникли проблемы с запоминанием параметров tar, попробуйте использовать pipe:

  • zcat file.tar.gz | tar xvf -
  • bzcat file.tar.bz2 | tar xvf -

Замените tar xv на tar tv чтобы просто просмотреть содержимое архива.

Лично я использую следующую мнемонику:

  • t, x или c для "табулирования", "извлечения" или "создания" соответственно.
  • v для перечисления всех файлов.
  • z, j или ничего для tar.gz, tar.bz2 или простого .tar соответственно.
  • f для указания имени файла по сравнению с использованием по умолчанию stdin/stdout или ленточного устройства.

Хотя "j" и "bzip2", похоже, не имеют ничего общего друг с другом, мне легко запомнить это исключение.

Кроме того, мне смешно, что Googling заменил "man tar".

3

Человек твой друг.

man tar

2

Я всегда зачитываю команды в уме, печатая

сжать подробный zip-файл

tar cvzf FILE

извлечь подробный почтовый файл ФАЙЛ

tar xvzf FILE
2

Я делаю следующее

Чтобы создать tar:

tar czvf foo.tar.gz <files to be included>

Распаковать:

tar zxvf foo.tar.gz

Это должны быть основные переключатели, о которых вам нужно беспокоиться:

c - create
z - compress/uncompress
x - extracte
v - verbose
f - file

Пока вы пытаетесь перемещать файлы по каталогам, вы можете делать некоторые более интересные вещи, такие как tar и untar inline:

tar cf - <files to be copied> | (cd <target directory>; tar xvf - )
1

90% времени я просто использую

tar -xvf file.*  

х: извлечение
v: быть многословным (необязательно)
f: входной файл (tar, gz, bzip2 и т. д.)

Полегче, а? :)
Используйте Fileroller или Ark, если вы не в консоли.

1

Уже много лет я использую Perl-скрипт под названием aunpack , часть проекта atool . Итак, вы просто запускаете: aunpack foo.{zip/tar.gz/tar.bz2} и он делает правильные вещи в зависимости от расширения файла.

Другое преимущество aunpack заключается в том, что он не будет загрязнять текущий каталог большим количеством файлов. Скажем, в foo.zip есть 20 файлов, которые не находятся в подкаталоге. Вместо того, чтобы извергать эти файлы в текущем каталоге, aunpack создаст подкаталог foo и поместит туда все файлы.

1

Три наиболее часто используемые операции:

--create -c

Создайте новый архив tar.

--list -t

Список содержимого архива.

--extract -x

Извлеките одного или нескольких участников из архива.


Пять продвинутых операций с tar:

--append -r

Добавить новые записи в архив, который уже существует.

--update -u

Добавьте более поздние копии участников архива в конец архива, если они существуют.

--concatenate --catenate -A

Добавьте один или несколько уже существующих архивов в конец другого архива.

--delete

Удалить элементы из архива (не работает на лентах).

--compare --diff -d

Сравните участников архива с их аналогами в файловой системе.


1

Все, что вам нужно, это tar x (извлечение из stdin), tar c (tar в stdout), gzip -c (gzip из stdin в stdout; от -1 до -9 для уровней сжатия; то же самое касается bzip2) и gunzip -c (gunzip) от стандартного ввода к стандартному выводу) - все остальное - трубы.

Для tar и gzip:

$ tar c * | gzip -c > out.tar.gz

Разархивировать и распаковать

$ gunzip -c < out.tar.gz | tar x

Если вы хотите сладкие индикаторы выполнения, используйте pv, который похож на cat, но показывает индикаторы выполнения:

$ tar c * | bzip2 -c | pv > out.tar.gz
 22.6MiB 0:00:03 [3.64MiB/s] [  <=>                           ]
$ pv in.tar.gz | bunzip2 -c | tar x
   80MiB 0:00:00 [  58MiB/s] [===============================>] 100%
0

Я думаю, что легко думать о том, что вы хотите, а не только некоторые буквы.

Чтобы проиллюстрировать это, я буду использовать пример того, как извлечь file.tar.gz:

Поскольку это tar-файл, вы должны использовать программу tar. Тогда это варианты:

  1. х , так как вы хотите е х путей.
  2. z, если файл заканчивается на .gz. (gz - после tar в имени файла). Этот параметр архивирует архив.
  3. f для файла, за которым следует имя архива.

Это продемонстрировано в примере ниже:

tar xzf file.tar.gz
0

Насколько я помню, это всегда "tar XXvf", где два X

  • х для е Х тракта или с для С reate и,
  • либо z = gzip, j = bzip2 (gzip встречается чаще, так что обычно это z, по какой-то причине j = bzip2 просто застрял в моей голове).

Иногда вы сталкиваетесь со сжатыми, но не заархивированными файлами, где добавляете un в любой тип сжатия. например, g un zip или b un zip2.

Во всяком случае, я забываю 2 и иногда типа "bzip".

0

Вы также можете создать псевдоним. просто добавьте эти две строки в файл ~/.bash_aliases :

alias untar="tar xvf"
alias dotar="tar cvf"

затем вы можете использовать untar foo.tar.gz для распаковки и dotar foo.bar для сжатия. Вы можете использовать другие псевдонимы, которые легко запомнить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .