Разархивация tar'а и перезапись
Модераторы: /dev/random, Модераторы разделов
-
sidd
- Сообщения: 667
- ОС: Slackware 13.37
Разархивация tar'а и перезапись
Как разархивировать tar так, чтоб в случае отличия файла от оригинала выводился запрос на его перезапись? Структуры файлов в архиве и в директории, в которую надо разархивировать, идентичны. Просто некоторые файлы в директории могут отличаться от тех, что в архиве.
Patrick is God.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Разархивация tar'а и перезапись
вроде никак. можно так добавить tar --update. ничего лучше tar -x -C /tmp && cp --backup /tmp/... . в голову не приходит...
-
sidd
- Сообщения: 667
- ОС: Slackware 13.37
Re: Разархивация tar'а и перезапись
drBatty, спасибо, хорошая идея) Только вместо cp --backup можно использовать mv -i — оно тогда спрашивать будет.
Patrick is God.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Разархивация tar'а и перезапись
я так в автоматическом режиме делаю. оно умеет нумерованные копии делать (версия 1, версия 2...).
вообще-то tar тоже примерно так умеет, но это надо его разжать, а потом сжать. Долго очень. А вообще-то есть mercurial & git. Но иногда просто не нужно.
-
ZyX
- Сообщения: 355
- ОС: Gentoo
Re: Разархивация tar'а и перезапись
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'а и перезапись
жуть какая :(
-
Ginzburg
- Сообщения: 37
- ОС: Windows Vista
Re: Разархивация tar'а и перезапись
Код: Выделить всё
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Я конечно далек от мысли... (с)