Не створюйте файл 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
.