створення архіву tar, не включаючи батьківський каталог


62

Я намагаюся створити графічну програму для мого сценарію.

Всередині сценарію я використовую tar для створення архіву смоли.

Від графічної програми я отримую повне ім’я файлу, який я хочу створити в архіві смоли.

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

Мій архів смоли включає в себе домашнє ім’я, ім’я користувача, dir1, dir2 та selecteddir, тоді як я хочу, щоб tar створював архів лише з урахуванням selecteddir.

Відповіді:


79

Для цього ви можете скористатися -Cопцією tar:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

З чоловічої сторінки tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.

чи знаєте ви, як я можу розділити $ path на selecteddir та шлях вгору / home / username / dir1 / dir2, тож я можу користувач -C варіант
Sujit Maharjan

@SujitMaharjan ви можете використовувати dirnameдля вилучення всього, поки не буде вибрано " selectdir " і basenameдля вилучення "selecteddir". Спробуйте дві команди з аргументом $ path як аргумент.
mkc

2
Варто додати, що це справедливо як для GNU, так і для BSD Tar.
Люк Екстон

5
Зауважте, що ви не можете використовувати глобул за допомогою параметра -C. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'не буде працювати.
Крістіан Лонг

Не працює: tar: selecteddir: Не вдається статистика: Немає такого файлу чи каталогу
tribbloid

11

Є два методи, які можна використовувати для вирішення цієї проблеми.

Перший, на мою думку, простіше. Просто cdвведіть каталог безпосередньо над тим, який потрібно стиснути. У цьому випадку це було б dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

Другий спосіб - використовувати параметр, --transformякий приймає sedвираз і запускає його проти імен файлів. Примітка: вам доведеться бігти /в sedвиразі.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

Чи потрібен перший метод крапки (.) На кінці? Я пробував без і отримав: tar: Cowardly refusing to create an empty archive. Коли у мене є точка, вона дратує змушує корінь містити каталог з назвою .. Отже, близько, але не ідеально.
JW01

1
Далі до мого попереднього коментаря. Я вирішив своє питання. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *працював на мене. Використання зірочки замість крапки .. Оновлення: Woops - Хоча я втратив приховані файли.
JW01

6

Спочатку перейдіть до робочого каталогу,

cd /your/working/directory/ 

Тоді використовуйте магію *:-)

tar -cvf temp.tar *

Я намагаюся архівувати приховані каталоги, і якщо я додаю їх безпосередньо (Ні *), він працює, але при використанні * він додає лише ім'я архіву до архіву ...
Ole

1

Власне, я знайшов проблему, використовуючи відповідь Кетана

tar -C / home / username / dir1 / dir2 -cvf temp.tar selecteddir

Коли ви хочете просто скопіювати всі файли просто в dir2, просто всі файли, тоді я спершу виходжу з ідеї:

tar -C / home / username / dir1 / dir2 -cvf temp.tar *

Однак, якщо ви не перебуваєте в каталозі dir2, це може спричинити проблеми, оскільки * позначить файли у вашому поточному діектрої. І я усунув проблему за допомогою команди нижче:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./

6
Але тоді ваш архів temp.tar містить .як кореневу папку.
cgrim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.