Как извлечь правильное разрешение владельца по tar? - PullRequest
0 голосов
/ 11 мая 2018

Я хочу упаковать определенное содержимое некоторых подкаталогов и извлечь их с оригинальным разрешением.В следующем примере он извлекает каталог a с неверным разрешением, я предпочитаю, чтобы он оставался таким же, как и исходный foo.Как это сделать?Какой параметр я должен добавить в tar при архивировании или распаковке?

создать файлы тестового примера:

foo ~/tmp $ mkdir -p a/b ; touch a/f1 a/b/f2

создать файл архива:

foo ~/tmp $ tar cf a.tar a/b

показать содержимое файла tar:

foo ~/tmp $ tar tvf a.tar
drwxr-xr-x foo/op           0 2018-05-11 10:33 a/b/
-rw-r--r-- foo/op           0 2018-05-11 10:33 a/b/f2

извлечение с root пользователем:

foo ~/tmp $ mkdir c
foo ~/tmp $ sudo tar -C c -xpf a.tar
foo ~/tmp $ find c -ls
  4743788      4 drwxr-xr-x   3  foo     op           4096 May 11 10:34 c
  4743789      4 drwxr-xr-x   3  root     root         4096 May 11 10:34 c/a
  4743790      4 drwxr-xr-x   2  foo     op           4096 May 11 10:33 c/a/b
  4727961      0 -rw-r--r--   1  foo     op              0 May 11 10:33 c/a/b/f2

То, что я ожидаю, это

  4743789      4 drwxr-xr-x   3  foo     op         4096 May 11 10:34 c/a

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Разделить архив на два шага, первый шаг архивировать как предыдущий

tar cf a.tar a/b

Второй шаг для добавления каталога без рекурсии

tar -rf a.tar --no-recursion a
0 голосов
/ 11 мая 2018

Я думаю, что это правильное поведение.Ваш 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
...