Не создавайте файл tar в каталоге, который вы упаковываете:
tar -czf /tmp/workspace.tar.gz .
делает трюк, за исключением того, что при распаковке он извлекает файлы по всему текущему каталогу. Лучше сделать:
cd ..
tar -czf workspace.tar.gz workspace
или, если вы не знаете название каталога, в котором вы были:
base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base
(Это предполагает, что вы не переходили по символическим ссылкам, чтобы добраться до того места, где вы находитесь, и что оболочка не пытается угадать вас, перепрыгивая через символическую ссылку - bash
не заслуживает доверия в этом отношении. Если вы надо беспокоиться об этом, используйте cd -P ..
, чтобы сделать каталог физических изменений. Глупо, что это не поведение по умолчанию, на мой взгляд - сбивающее с толку, по крайней мере, для тех, для кого cd ..
никогда не имел никакого альтернативного значения.)
Один комментарий в дискуссии гласит:
Мне нужно [...] исключить верхний каталог, а мне нужно [...] поместить tar в базовый каталог.
Первая часть комментария не имеет особого смысла - если файл tar содержит текущий каталог, он не будет создан при извлечении файла из этого архива, поскольку по определению текущий каталог уже существует (за исключением очень странные обстоятельства).
Вторая часть комментария может рассматриваться одним из двух способов:
- Либо: создайте файл где-нибудь еще -
/tmp
- это одно из возможных мест - и затем переместите его обратно в исходное местоположение после его завершения.
- Или: если вы используете GNU Tar, используйте опцию
--exclude=workspace.tar.gz
. Строка после =
является шаблоном - пример - самый простой шаблон - точное совпадение. Возможно, вам придется указать --exclude=./workspace.tar.gz
, если вы работаете в текущем каталоге вопреки рекомендациям; вам может потребоваться указать --exclude=workspace/workspace.tar.gz
, если вы работаете на один уровень выше, чем предложено. Если вы хотите исключить несколько файлов tar, используйте '*
', как в --exclude=./*.gz
.