Я думаю, что это правильное поведение.Ваш a.tar
не содержит каталог c/a
, поэтому его необходимо создать во время распаковки.Это делается в контексте пользователя, с которым вы распаковываете архив: - root .
Параметр tar -p
сохраняет права на каталоги, но только существующие в архиве.
Примечание: я распаковываю его с пользователем smalltalk .
Опция, когда вы уже создали архив и хотите удалить файлы из уже созданного архива
Я думаю, что вы могли бы упаковать все с:
tar cf a.tar a
, что бы потом выдало
tar tvf a.tar
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/b/
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/b/f2
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/f1
Затем вы можете просто удалить каталоги / файлы, которые вам не нужны в этом случае a/f1
:
tar -vf a.tar --delete a/f1
Вы получите:
tar tvf a.tar
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/b/
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/b/f2
Так как теперь каталог a/
является частью упакованного файла, вы получите правильный результат при распаковке:
find c -ls
149236 0 drwxrwxr-x 3 smalltalk smalltalk 14 May 11 10:14 c
17208669 0 drwxrwxr-x 3 smalltalk smalltalk 14 May 11 10:01 c/a
36340903 0 drwxrwxr-x 2 smalltalk smalltalk 15 May 11 10:01 c/a/b
36333667 0 -rw-rw-r-- 1 smalltalk smalltalk 0 May 11 10:01 c/a/b/f2
Первое редактирование - Второй параметр - исключить перед упаковкой
Создает файл tar
без каталога на первом месте с параметром --exclude
:
Например:
tar cf a.tar a --exclude=a/f1
Что создаст:
tar tvf a.tar
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/b/
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/b/f2
Тогда извлеченный каталог будет иметь правильные права.
Второе редактирование - добавление самого верхнего каталога
- на основе комментария (много файлов) - добавление каталога послеархив уже создан
Если у вас много файлов, я думаю, что лучшим решением будет добавить каталог в уже созданный вами архив.
После этого вы создадите файл каксделал в вашем вопросе:
tar cf a.tar a/b
Затем вы добавили бы верхний каталог (опция --no-recursion
исключает подкаталоги):
tar -rvf a.tar --no-recursion a/
Затем вы получите файл с добавленнымкаталог:
tar tvf a.tar
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/b/
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/b/f2
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/
Тогда вы получите правильное извлечение:
find c -ls
68333351 0 drwxrwxr-x 3 smalltalk smalltalk 14 May 11 11:01 c
87520961 0 drwxrwxr-x 3 smalltalk smalltalk 14 May 11 10:01 c/a
149236 0 drwxrwxr-x 2 smalltalk smalltalk 15 May 11 10:01 c/a/b
824154 0 -rw-rw-r-- 1 smalltalk smalltalk 0 May 11 10:01 c/a/b/f2