Как извлечь файлы в другой каталог с помощью команды tar?

672

Я думал, что tar archive.tar /users/mylocationбудет работать, но это не так. Как я могу это сделать?

goovim
источник
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: Действительно, справочная страница tar не очень полезна. Он описывает «-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, что ломает вещи, как ... честно говоря, отчасти ожидается. Традиционные флаги передаются как один BLOB-объект в качестве первого аргумента. Вы не можете ожидать, что они будут работать, если они не будут первыми. (Я имею в виду, да, это можно интерпретировать в любом случае - моя точка зрения такова, что это будет выше и выше, не стандартным)
Ник Хартли,

Ответы:

958

Чтобы извлечь архив в каталог, отличный от текущего, используйте параметр tar -Cили --directory, как в

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

Обратите внимание, что целевой каталог должен существовать до запуска этой команды (он может быть создан mkdir /target/directory).

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

Уэсли Райс
источник
Можно ли удалить путь: то есть просто получить файл
zzapper
3
Если это файл большего размера, при запуске команды все, что вы получаете, - это не выводить данные в течение нескольких секунд или даже минут, пока она работает. Вы можете исправить это, добавив -vфлаг ( подробный режим ), в котором указано имя каждого файла при его извлечении.
IQAndreas
Если у вас возникли проблемы с этим, обратите внимание на --strip-components=1совет другого ответа.
DreadPirateShawn
9
@consultstan xkcd.com/1168
Дункан Х Симпсон
9
Разве не удивительно, что после всех этих лет, когда tarнакопились все опции , все еще нет возможности создать выходной каталог, если он не существует ?
EM0
261

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

tar xf archive.tar -C /target/directory --strip-components=1
Брайан Ларсен
источник
2
Спасибо. Загрузки через wget / etc всегда имеют «родительский» каталог. Это полный ответ IMO - или следует отметить в ответе выше.
bshea
Как раз то, что я искал. --strip-componentsтак полезно при запуске провайдеров, которые могут использовать разные версии. Этот способ /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все как положено = когда вы распаковываете его сейчас, он будет не подвергаться обработке (папка будет создана, если вы ее удалили) как /tmp/folder/.

Но когда вы создадите tar as tar -zcvf tmp-folder.tar.gz /tmp/folderи распакуете его в папку / tmp, результатом будет /tmp/tmp/folderдиректория! В таком случае вы должны распаковать его / -tar -xf tmp-folder.tar.gz -C /

Betlista
источник
1

С помощью tar 1.29 мы можем просто добавить имя каталога после имени файла tar. Например,

tar zxvf tar-file directory-name/
Шунмуга приян Сельвараджу
источник