Как извлечь одну папку из большого архива tar.gz?

132

Я использую эту команду в архиве 5 ГБ

tar -zxvf archive.tar.gz /folder/in/archive

это правильный способ сделать это? Кажется, это происходит вечно без вывода командной строки ...

Гарретт Холл
источник
Вы использовали абсолютный или относительный путь? Должен быть относительным, кроме того, что выглядит правильно. Как долго вы позволяете ему работать, и насколько хороша ваша система? На быстрой машине это займет не менее нескольких минут. Потенциально час или больше? Сейчас я провожу тест.
Кевин
Да, это закончилось через ~ 1 час, но абсолютный путь был неправильным, вы были правы.
Гарретт Холл
5
В Linux, вы можете посмотреть , как далеко в архив tarнаходится с cat /proc/$(pidof tar)/fdinfo/0(адаптировать команду , если у вас есть более чем один tarпроцесс запущен).
Жиль
Важной частью также не является косая черта. Использование folder/folder2/не будет работать.
Marki555

Ответы:

145

tarсохраняет относительные пути по умолчанию . GNU tar даже говорит, что если вы попытаетесь сохранить абсолютный путь:

tar -cf foo.tar /home/foo
tar: Removing leading `/' from member names

Если вам нужно извлечь конкретную папку, посмотрите, что находится в файле tar:

tar -tvf foo.tar

И обратите внимание на точное имя файла. В случае моего foo.tarфайла я мог извлечь /home/foo/bar, сказав:

tar -xvf foo.tar home/foo/bar # Note: no leading slash

Так что нет, то, как вы разместили (не обязательно) правильный способ сделать это. Вы должны опустить ведущий слеш. Если вы хотите смоделировать абсолютные пути, сделайте это cd /сначала и убедитесь, что вы являетесь суперпользователем. Кроме того, это делает то же самое:

tar -C / -xvf foo.tar home/foo/bar # -C is the ‘change directory’ option

Есть очень очевидные, веские причины, почему tarпреобразует пути в относительные. Одним из них является возможность восстановить архив в местах, отличных от его исходного источника. Другой - это безопасность. Вы можете извлечь архив, ожидать, что его файлы появятся в вашем текущем рабочем каталоге, и вместо этого переписать системные файлы (или вашу собственную работу) в другом месте по ошибке.

Примечание: если вы используете эту -Pопцию, tar будут заархивированы абсолютные пути. Поэтому всегда стоит проверить содержимое больших архивов перед извлечением.

Алексиос
источник
36
--strip-components=Nможет быть полезным для некоторых здесь.
Acumenus
2
в моем случае нужно было писать ./foldername/вместо foldername, я думаю, это было потому, что когда я создавал смолу, я создал ее tar -cvf santi.tar ./*и когда «перечислял» смолу, это то, что он сказалdrwxr-xr-x santi/santi 0 2016-04-11 09:42 ./foldername/
santiago arizti
1
А про .gz?
Питер Краусс
1
@PeterKrauss изменяется -xvfна -xzvf(добавляя -zопцию) и, очевидно, foo.tarна foo.tar.gzваш архив или как его там. То же самое верно для -j(bz2) и для некоторых последних версий -J(xz). Иначе конвейер вроде zcat foo.tar.gz | tar -xvf - …тоже работает.
Алексиос
И помните, если вы устали от многословного вывода во время извлечения, просто пропустите vвсе примеры. Например, tar -tf foo.tarи tar -xf foo.tar ....
Бо Р