Я создал тарбол в Ubuntu 14.04 с:
cd /tmp
tar -cfvz archive.tar.gz /folder
Теперь я хочу извлечь конкретную папку в тарболе (которая внутри архива лежит в /tmp
) в определенную папку:
cd /tmp
tar -xfvz archive.tar.gz folder/in/archive -C /tmp/archive
Результатом должна стать новая папка в /tmp
с именем archive
. Это верно? Особенно отсутствующий слеш (относительный путь) для извлекаемой папки и абсолютный путь с начальным слешем для создаваемой папки?
Так как Вы находитесь в /tmp
уже, можно просто отбросить -C
опция (так как по умолчанию tar
извлечет файлы в текущем рабочем каталоге), и просто добавьте --strip-components=2
:
tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive
GNU tar
относительными путями хранилищ по умолчанию.
Могут ли относительные пути использования архива быть проверены путем выполнения tar -tf archive | head -n 1
, который распечатает путь первого файла в архиве; если путь того файла является относительным путем, все файлы в архиве используют относительные пути:
% tar -tf bash-4.3.tar.gz | head -n 1
bash-4.3/
Для извлечения единственного файла / папка из архива, который использует относительные пути без его предков в относительный путь, Вам будут нужны две опции: -C
и --strip-components=N
: в примере ниже архива bash-4.3.tar.gz
относительные пути использования и содержат файл bash-4.3/doc/bash.html
который извлечен в относительный путь path
(-C
указывает каталог, в котором можно извлечь файлы, --strip-components=2
указывает, что родитель и родитель родителя извлеченных файлов должны быть проигнорированы, так в этом случае только bash.html
будет извлечен в целевой каталог):
% tree
.
├── bash-4.3.tar.gz
└── path
1 directory, 1 file
% tar -tf bash-4.3.tar.gz | grep -F 'bash.html'
bash-4.3/doc/bash.html
% tar -C path --strip-components=2 -zxf bash-4.3.tar.gz bash-4.3/doc/bash.html
% tree
.
├── bash-4.3.tar.gz
└── path
└── bash.html
1 directory, 2 files
Так, назад к Вашей команде, так как Вы находитесь в /tmp
уже, можно просто отбросить -C
опция (так как по умолчанию tar
извлечет файлы в текущем рабочем каталоге), и просто добавьте --strip-components=2
:
tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive
tar
относительные пути хранилищ
, Если необходимо извлечь конкретную папку, взгляните на то, что находится в файле tar:
tar -tvf archive.tar.gz
И примечание точное имя файла. tar -xvf foo.tar folder/in/archive
Примечание #: никакая ведущая наклонная черта