7

Есть ли способ выполнить

tar cjvf foo.tar.bz2 project-root

Так что, когда архив извлекается, он не извлекается в проект-root, а извлекается во что-то еще? т.е.

tar xjvf foo.tar.bz2
cd something-else
# see all files that were within original project-root

Я знаю о -C, но я хочу, чтобы что-то еще не существовало.

2 ответа2

4

Сначала создайте символическую ссылку, и пусть tar будет следовать за ней.

ln -s project-root something-else
tar cjf foo.tar.bz2 something-else/*
rm something-else

/* Необходим для перехода по ссылке и выбора всего содержимого, а не просто для извлечения самой символической ссылки. В качестве альтернативы вы можете использовать опцию -h в GNU tar (но это также будет следовать ссылкам внутри, что вы, возможно, не захотите делать) или опцию H в BSD tar (как на Mac).

Вы даже можете сделать это изнутри проекта root:

cd project-root
ln -s . something-else
tar cjf foo.tar.bz2 --exclude=something-else/something-else something-else/*
rm something-else

Если вы явно не исключите это (как указано выше), символическая ссылка будет существовать и в tarball.

Очевидно, что если вы делаете это много раз и не возражаете против символической ссылки, висящей вокруг нее, не нужно каждый раз удалять и создавать заново.

2

Вы можете переименовать project-root внутри tarball с помощью 7-zip GUI (и, возможно, других программ-архиваторов), но это может сделать полный цикл распаковки-повторного сжатия сжатых tar -архивов . (Читайте: это может занять некоторое время на больших сильно сжатых архивах.)

Лучший способ сделать то, что вы хотите, это изменить имя перед созданием тарбола. Простой способ - временно переименовать проект-корень в нечто другое:

# temporary rename; tar; restore original name
$ mv project-root something-else ; tar cjf foo.tar.bz2 something-else ; mv something-else project-root

Возможно, я бы пошел немного сложнее: сделать копию с именем, которое я хочу, в архиве. Это позволяет избежать потенциальных ошибок или пропущенных шагов в любом процессе восстановления, и я мог бы хотеть сохранить обе копии для других целей.

# make me a copy
$ ( cd project-root ; tar cf - . ) | ( mkdir something-else; cd something-else; tar xf - )

# test the copy here if needed
$ diff -r --brief project-root/ something-else/

# create my tarball
$ tar cjf foo.tar.bz2 something-else

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .