Как предотвратить извлечение tar из-за перезаписи каталогов символических ссылок

Примечание. Перезапись символических ссылок происходит, начиная с версии tar 1.27 или выше.

Ниже я пытаюсь показать, в чем именно заключается проблема.

содержимое dirtymp1

file1.txt
file2.txt

код для создания вышеуказанного каталога

rm -f -r dirtmp1 && mkdir dirtmp1 && cd dirtmp1 && touch file1.txt && touch file2.txt && ls -al

создание символической ссылки

cd ..
ln -s dirtmp1/ symlink1

теперь создайте файл tar, который содержит имя как symlink1

mkdir dirtmp1
cd dirtmp1
mkdir symlink1 && cd symlink1 && touch iNeedThisfile.txt && cd .. && tar -cvzf symlink1.tar.gz symlink1/

Извлеките файл tar в папку (symlnk1), перезаписав символическую ссылку. Все, что я хочу, это сохранить символическую ссылку и скопировать «iNeedThisfile.txt».

После запуска этой команды tar -xvf symlink1.tar.gz

symlink1: total 0 -rw-r--r-- 1 root root 0 Mar 24 18:14 iNeedThisfile.txt

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

Прошу прощения за то, что не смог передать свое сообщение меньшим количеством строк текста.


person forum.test17    schedule 24.03.2015    source источник
comment
Вы уверены, что это не работает? Это сработало для меня на машине CentOS 5.   -  person Etan Reisner    schedule 24.03.2015
comment
Вы хотите извлечь один файл из файла tar? tar -xvf {symlink1.tar.gz} {path/to/file}   -  person Soheil Hashemi    schedule 24.03.2015
comment
@Etan Reisner нет, это не работает на centos 7, версия tar 1.26   -  person forum.test17    schedule 25.03.2015
comment
@ Hidd3n Я не хочу извлекать один файл, но при извлечении не хочу переопределять символическую ссылку на файл.   -  person forum.test17    schedule 25.03.2015
comment
Почему вы извлекаете tar по другому пути, который не выходит из файла символической ссылки?   -  person Soheil Hashemi    schedule 25.03.2015
comment
@ Hidd3n Я не понял   -  person forum.test17    schedule 25.03.2015
comment
Я имею в виду, что извлечение tar-файла в другое место не имеет выходной символической ссылки, когда вы извлекаете, замена не происходит   -  person Soheil Hashemi    schedule 25.03.2015
comment
@ Hidd3n Это может быть так, но я хочу извлечь в то же место, и это работало раньше в версии tar 1.20, а не в версии tar 1.27.   -  person forum.test17    schedule 25.03.2015
comment
Изменяет ли что-нибудь использование флага -k для tar? (Я могу попробовать это на машине с CentOS 7 позже.)   -  person Etan Reisner    schedule 25.03.2015
comment
@EtanReisner, использующий флаг k, не перезапишет существующие файлы и сообщит об ошибке. Я хочу перезаписать существующие файлы в моем случае   -  person forum.test17    schedule 30.03.2015


Ответы (2)


У меня такая же проблема. В моем случае tar 1.23 имел правильное поведение (сохранил символическую ссылку), в то время как 1.26 имел новое поведение (удалил символическую ссылку и вместо этого создал каталог).

Я обнаружил, что добавление флага -h в tar в EXTRACT делает свою работу. Символическая ссылка сохраняется, и файлы добавляются в каталог, на который она указывает.

Например, мне пришлось перейти от

tar zxf foo.tar.gz

to

tar -h -zxf foo.tar.gz
person Brian    schedule 01.04.2015
comment
@Brain Большое спасибо за ответ, я прочитал документацию, но пропустил этот флаг -h. Я попробую это :) - person forum.test17; 02.04.2015
comment
Добавленный флаг -h не работал у меня в версии tar 1.26. Centos 7. Извлечение содержимого удаляет символическую ссылку :( - person forum.test17; 07.04.2015
comment
Работает для REHL 7. Этот кусок дерьма принес мне 2 дня разочарования. +1 - person Stelios Adamantidis; 09.05.2019
comment
Я не знаю, в какой ОС это работает, но я с @forum.test17 -- это не работает в моем Debian, tar 1.30+dfsg-6, как мы говорим. Извлечение содержимого с помощью tar -h -zxf также удаляет символическую ссылку для меня. - person xpt; 15.11.2020

Я использую Debian, и ответ Брайана мне не подходит. Перечитав OP еще раз, я понял, что OP хочет сохранить символическую ссылку каталога, тогда как я хочу сохранить символическую ссылку каждого отдельного файла. Но поскольку это единственный хит, который я нашел по этому поводу, и поскольку я уже напечатал свой ответ, я все равно предоставлю его для сохранения символической ссылки каждого отдельного файла.

Итак, вот решение, которое я нашел.

Прежде всего, мой Debian, как мы говорим:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

и мой tar 1.30+dfsg-6:

$ apt-cache policy tar
tar:
  Installed: 1.30+dfsg-6
  Candidate: 1.30+dfsg-6
  Version table:
 *** 1.30+dfsg-6 500
        500 http://deb.debian.org/debian buster/main amd64 Packages
        100 /var/lib/dpkg/status

Я нашел,

  • tar -h -xvf symlink1.tar.gz не получится. Извлечение содержимого таким образом удалит символические ссылки. tar -h --no-overwrite-dir -xvf symlink1.tar.gz тоже не получится. Но,
  • tar -h --overwrite -xvf symlink1.tar.gz будет работать! Извлечение содержимого таким образом сохранит символические ссылки каждого отдельного файла, но,
  • tar -h --overwrite -xvJf symlink1.tar.xz не получится. То есть то, что работает для .tar.gz, не будет работать для .tar.xz файлов.

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

person xpt    schedule 15.11.2020