создание архива 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.