создание архива tar без включения родительского каталога


63

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

Внутри скрипта я использую tar для создания архива tar.

Из графической программы я получаю полное имя файла, который я хочу создать архив tar.

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

Мой архив tar включает в себя home, username, dir1, dir2 и selecteddir, а я хочу, чтобы tar создавал архив только с выбранным dir.

Ответы:


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чтобы извлечь все до "selecteddir" и basenameизвлечь "selecteddir". Попробуйте две команды с аргументом $ path.
— MKC

2
Стоит добавить, что это справедливо как для GNU, так и для BSD Tar.
— Люк Экстон

5
Обратите внимание, что вы не можете использовать globbing с опцией -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

2

На самом деле, я нашел проблему, используя ответ Кетана

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

Когда вы хотите просто скопировать все файлы только в dir2, просто все файлы, тогда у меня сначала появляется идея:

tar -C / home / имя пользователя / dir1 / dir2 -cvf temp.tar *

Однако, если вы не находитесь в каталоге dir2, это может вызвать проблемы, поскольку * приведет к tar-файлам в вашей текущей директории. И я исправил проблему с помощью команды ниже:

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

7
Но тогда ваш архив temp.tar содержится .в корневой папке.
— cgrim
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.