Як витягти одну папку з великого архіву tar.gz?


131

Я використовую цю команду в архіві 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 ....
Bo R
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.