Як витягнути файли в інший каталог за допомогою команди 'tar'?


672

Я думав, що tar archive.tar /users/mylocationце спрацює, але це не так. Як я можу це зробити?


1
Крім того, -C, --directory DIR\n change to directory DIRслід скоріше описати як change output directory to DIR (will fail if DIR doesn't exist). Дякую @Mich. Дивіться також відповідь @ Bryan_Larsen.
дійсна

1
@Ujjwal Sing: Дійсно, сторінка людини з дьогтем не є такою корисною. Він описує "-C DIR" як "зміна в каталог DIR". Ще гірше: "tar -C mydir xf archive.tar" не працює, тоді як "tar xf archive.tar -C mydir" робить.
Пат Морін

@PatMorin Справедливо кажучи, щойно ви зрозумієте, що виклики аргументів, які ви використовуєте, має сенс. Ви також можете зробити tar xfC archive.tar mydirабо tar -C mydir -xf archive.tar. Це лише змішування прапорів у традиційному стилі та GNU, що руйнує речі, як ... чесно чекає. Традиційні прапори передаються всі як одна крапка як перший аргумент. Ви не можете очікувати, що вони спрацюють, якщо вони не перші. (Я маю на увазі, так, це можна так чи інакше інтерпретувати - моя думка, що це було б вище і далі, а не стандарт)
Нік Хартлі,

Відповіді:


958

Щоб витягнути архів у каталог, відмінний від поточного, скористайтеся параметром -Cабо --directory, tar, як в

tar -xf archive.tar -C /target/directory

Зауважте, що цільовий каталог повинен існувати перед запуском цієї команди (його може створити mkdir /target/directory).

Прочитайте сторінку керівництва (команда:) man tarдля інших параметрів.


Чи можна позбавити шлях: тобто просто
витягніть

3
Якщо це файл більшого розміру, то при запуску команди все, що ви отримуєте, не виводить протягом декількох секунд або навіть хвилин, поки він працює. Ви можете виправити це, додавши -vпрапор ( багатослівний режим ), який перелічує ім'я кожного файлу під час його вилучення.
IQAndreas

Якщо у вас виникли проблеми з цим, врахуйте також --strip-components=1поради з іншої відповіді.
DreadPirateShawn


9
Хіба не дивно, що після всіх цих років, зі всіма tarнакопиченими параметрами , досі немає можливості створити вихідний каталог, якщо він не існує ?
EM0

260

Зауважте, що якщо ваш tarball вже містить ім'я каталогу, яке ви хочете змінити, додайте --strip-components=1параметр:

tar xf archive.tar -C /target/directory --strip-components=1

2
Дякую. Завантаження через wget / тощо завжди має "батьківський" каталог. Це повна відповідь imo - або слід зазначити у відповіді вище.
bshea

Тільки те, що я шукав. --strip-componentsнастільки корисний під час роботи provisioners, що може використовувати різні версії. Цей спосіб /target/directoryможе бути загальним іменем, не турбуючись про те, як постачальник вирішив назвати свою папку архіву.
Jack_Hu

30

Поєднання попередніх відповідей та коментарів:

Щоб просто витягнути вміст і створити цільовий каталог, якщо він відсутній:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

Щоб витягнути, а також видалити кореневий (перший рівень) каталог у zip

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1

20

Ще один варіант - використовувати - one-top-level. Це автоматично створить каталог на основі імені файлу оригіналу.

tar zxvf filename.tgz --one-top-level

Додатково, якщо ви хочете, ви можете вказати свій власний та tar, створивши його автоматично.

tar zxvf filename.tgz --one-top-level=new_directory

3
Я використовую GNU tar 1.26, і я отримую невпізнану помилку варіантів для--one-top-level
Емма Струбелл

Це відповідь, яка мені була потрібна. Дуже корисно "не" вказувати ім'я каталогів або запам'ятати спеціальний код, який буде посилатися на файл для імені. Дякую.
Гіпокрит

2

Що мені здалося цікавим стосовно видобутку, це те, що це залежить від того, як ви створили архів, дивіться у цьому прикладі

cd /tmp
mkdir folder
touch folder/file.txt

коли ви tar -zcvf folder.tar.gz folderвсе робите так , як очікувалося = коли ви знімете його зараз, це буде untarred (папка буде створена, якщо ви її видалили) як /tmp/folder/.

Але, коли ви створите tar як tar -zcvf tmp-folder.tar.gz /tmp/folderі ви знімете його в папку / tmp, результатом буде /tmp/tmp/folderкаталог! У такому випадку вам доведеться знімати це / -tar -xf tmp-folder.tar.gz -C /


1

Завдяки tar 1,29, ми можемо просто додати ім'я каталогу після імені файлу tar. Наприклад,

tar zxvf tar-file directory-name/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.