Кроме того, -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).
Можно ли удалить путь: то есть просто получить файл
zzapper
3
Если это файл большего размера, при запуске команды все, что вы получаете, - это не выводить данные в течение нескольких секунд или даже минут, пока она работает. Вы можете исправить это, добавив -vфлаг ( подробный режим ), в котором указано имя каждого файла при его извлечении.
IQAndreas
Если у вас возникли проблемы с этим, обратите внимание на --strip-components=1совет другого ответа.
Разве не удивительно, что после всех этих лет, когда tarнакопились все опции , все еще нет возможности создать выходной каталог, если он не существует ?
EM0
261
Обратите внимание, что если ваш tarball уже содержит имя каталога, который вы хотите изменить, добавьте --strip-components=1параметр:
tar xf archive.tar -C /target/directory --strip-components=1
Спасибо. Загрузки через 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
Я использую 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 /
-C, --directory DIR\n change to directory DIR
скорее следует описать какchange output directory to DIR (will fail if DIR doesn't exist)
. Спасибо @Mich. Смотрите также ответ @ Bryan_Larsen.tar xfC archive.tar mydir
илиtar -C mydir -xf archive.tar
. Это только смешивает флаги в традиционном стиле и в стиле GNU, что ломает вещи, как ... честно говоря, отчасти ожидается. Традиционные флаги передаются как один BLOB-объект в качестве первого аргумента. Вы не можете ожидать, что они будут работать, если они не будут первыми. (Я имею в виду, да, это можно интерпретировать в любом случае - моя точка зрения такова, что это будет выше и выше, не стандартным)Ответы:
Чтобы извлечь архив в каталог, отличный от текущего, используйте параметр tar
-C
или--directory
, как вОбратите внимание, что целевой каталог должен существовать до запуска этой команды (он может быть создан
mkdir /target/directory
).Прочтите страницу руководства (команда:)
man tar
для других опций.источник
-v
флаг ( подробный режим ), в котором указано имя каждого файла при его извлечении.--strip-components=1
совет другого ответа.tar
накопились все опции , все еще нет возможности создать выходной каталог, если он не существует ?Обратите внимание, что если ваш tarball уже содержит имя каталога, который вы хотите изменить, добавьте
--strip-components=1
параметр:источник
--strip-components
так полезно при запуске провайдеров, которые могут использовать разные версии. Этот способ/target/directory
может быть общим именем, не беспокоясь о том, как провайдер решил назвать свою папку архива.Объединяя предыдущие ответы и комментарии:
Чтобы просто извлечь содержимое и создать целевой каталог, если он отсутствует:
Извлечь, а также удалить корневой каталог (первый уровень) в ZIP
источник
Другим вариантом является использование --one-top-level. Это автоматически создаст каталог на основе имени файла оригинала.
Кроме того, если вы хотите, вы можете указать свой собственный, и tar создаст его автоматически.
источник
--one-top-level
Что мне показалось интересным в отношении извлечения, так это то, что это зависит от того, как вы создали архив, см. Этот пример.
когда вы делаете
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 /
источник
С помощью tar 1.29 мы можем просто добавить имя каталога после имени файла tar. Например,
источник