Разархивация tar'а и перезапись

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
sidd
Сообщения: 667
ОС: Slackware 13.37

Разархивация tar'а и перезапись

Сообщение sidd »

Как разархивировать tar так, чтоб в случае отличия файла от оригинала выводился запрос на его перезапись? Структуры файлов в архиве и в директории, в которую надо разархивировать, идентичны. Просто некоторые файлы в директории могут отличаться от тех, что в архиве.
Patrick is God.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разархивация tar'а и перезапись

Сообщение drBatty »

sidd писал(а):
27.04.2011 02:58
Как разархивировать tar так, чтоб в случае отличия файла от оригинала выводился запрос на его перезапись?

вроде никак. можно так добавить tar --update. ничего лучше tar -x -C /tmp && cp --backup /tmp/... . в голову не приходит...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sidd
Сообщения: 667
ОС: Slackware 13.37

Re: Разархивация tar'а и перезапись

Сообщение sidd »

drBatty, спасибо, хорошая идея) Только вместо cp --backup можно использовать mv -i — оно тогда спрашивать будет.
Patrick is God.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разархивация tar'а и перезапись

Сообщение drBatty »

sidd писал(а):
27.04.2011 18:39
Только вместо cp --backup можно использовать mv -i — оно тогда спрашивать будет.

я так в автоматическом режиме делаю. оно умеет нумерованные копии делать (версия 1, версия 2...).
вообще-то tar тоже примерно так умеет, но это надо его разжать, а потом сжать. Долго очень. А вообще-то есть mercurial & git. Но иногда просто не нужно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Разархивация tar'а и перезапись

Сообщение ZyX »

extract-ask.py (Created by format.vim)

#!/usr/bin/python import tarfile import sys import os if(len(sys.argv)!=3): sys.exit(1) tf=tarfile.open(sys.argv[1], 'r') os.chdir(sys.argv[2]) def yes(msg): print msg return sys.stdin.readline()=='y\n' def textract(tf, f): tf.extract(f) for f in tf: print "Extracting "+f.name if(f.type is '0'): if(os.path.exists(f.name)): if(os.path.isdir(f.name)): if(yes("Overwrite directory "+f.name+" with a file?")): for root, dirs, files in os.walk(f.name, topdown=False): map(lambda f: os.remove(os.path.join(root, f)), files) os.rmdir(root) textract(tf, f) else: differs=0 if(f.size != os.stat(f.name).st_size): differs=1 else: fobj=tf.extractfile(f) oldfobj=open(f.name, 'r') readbytes=0 while(readbytes<f.size): s1=fobj.read(256) s2=oldfobj.read(256) # It does not matter, how many bytes were really read readbytes+=256 if(s1!=s2): differs=1 break if(differs): if(yes("File "+f.name+" differs. Overwrite?")): textract(tf, f) else: textract(tf, f) else: textract(tf, f)


Медленно, но работает. Делает именно то, что запрошено: спрашивает если файлы различаются, в остальных случаях молчит. Не проверяет соответствие разрешений.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Разархивация tar'а и перезапись

Сообщение drBatty »

ZyX писал(а):
27.04.2011 19:57
Медленно, но работает. Делает именно то, что запрошено: спрашивает если файлы различаются, в остальных случаях молчит. Не проверяет соответствие разрешений.

жуть какая :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Разархивация tar'а и перезапись

Сообщение Ginzburg »

Код: Выделить всё

tar tf 123.tar | while read; do tar Oxf 123.tar $REPLY | diff --brief -H - $REPLY > /dev/null 2>&1; [ $? -eq 1 ] && (read -p "Rewrite \"$REPLY\" y/n ?: " -u 1 x; [ "$x" != "y" ]) || tar xf 123.tar $REPLY; done
Я конечно далек от мысли... (с)
Спасибо сказали: