Вот скрипт Python, который я собрал. Это было минимальное тестирование до сих пор. Я сделал базовое тестирование в Python 2.6. Но я предпочитаю идею Python в целом, потому что он должен прерваться с исключением, если произойдет какая-либо ошибка, в то время как сценарий bash не может.
Сначала проверяется, что входной файл действителен и не распакован. Затем он копирует входной файл в «резервный» файл с расширением «.bak». Затем он распаковывает исходный файл, перезаписывая его.
Я уверен, что есть вещи, которые я упустил. Пожалуйста, не стесняйтесь оставлять отзывы.
#!/usr/bin/python
# Note, written for Python 2.6
import sys
import shutil
import zipfile
# Get a single command-line argument containing filename
commandlineFileName = sys.argv[1]
backupFileName = commandlineFileName + ".bak"
inFileName = backupFileName
outFileName = commandlineFileName
checkFilename = commandlineFileName
# Check input file
# First, check it is valid (not corrupted)
checkZipFile = zipfile.ZipFile(checkFilename)
checkZipFile.testzip()
# Second, check that it's not already uncompressed
isCompressed = False
for fileObject in checkZipFile.infolist():
if fileObject.compress_type != zipfile.ZIP_STORED:
isCompressed = True
if isCompressed == False:
raise Exception("File is already uncompressed")
checkZipFile.close()
# Copy to "backup" file and use that as the input
shutil.copy(commandlineFileName, backupFileName)
inputZipFile = zipfile.ZipFile(inFileName)
outputZipFile = zipfile.ZipFile(outFileName, "w", zipfile.ZIP_STORED)
# Copy each input file's data to output, making sure it's uncompressed
for fileObject in inputZipFile.infolist():
fileData = inputZipFile.read(fileObject)
outFileObject = fileObject
outFileObject.compress_type = zipfile.ZIP_STORED
outputZipFile.writestr(outFileObject, fileData)
outputZipFile.close()
Это в Mercurial репозитории в BitBucket .