zip.py: Save symlinks.
unzip.py: Restore symlinks.
echo -n "Name of the distribution file (without extension) [$Pwd]: "
read zip
if [ "$zip"x = x ]; then zip="$Pwd"; fi
- cd .. && zip -r9 "$zip".zip "$Pwd" &&
+ cd .. && zip -ry9 "$zip".zip "$Pwd" &&
echo ../"$zip".zip created.
+ t d & f ^\.\.$
+ ! f \.(z|Z|bz2|gz|lz|lzma)|(tbz2|tgz|tz|zip|ZIP|rar|RAR|xz|7z)$ & t lr
z zip the file/directory
- exec zip -r9 %f.zip %f
+ exec zip -ry9 %f.zip %f
+ ! f \.(z|Z|bz2|gz|lz|lzma)|(tbz2|tgz|tz|zip|ZIP|rar|RAR|xz|7z)$ & t lr
y zip the file/directory recoding filename(s)
+ t t
Z zip selected files/directories
ZIP=%{Enter zip name}
- exec zip -r9 "$ZIP" %s
+ exec zip -ry9 "$ZIP" %s
+ t t
Y zip selected files/directories recoding filenames
cp_*) cmd="cp -p" ;;
mv_*) cmd=mv ;;
*)
- echo "Uncnown command $0, aborting" >&2
+ echo "Unknown command $0, aborting" >&2
exit 2
;;
esac
if not tgt.endswith('/'):
infile = zf.open(zinfo.filename)
- fp = open(tgt, 'wb')
- copyfileobj(infile, fp)
- fp.close()
+ if zinfo.external_attr == 0xA1ED0000:
+ os.symlink(infile.read(), tgt)
+ else: # regular file
+ fp = open(tgt, 'wb')
+ copyfileobj(infile, fp)
+ fp.close()
infile.close()
- dt = time.mktime(zinfo.date_time + (0, 0, -1))
- os.utime(tgt, (dt, dt))
+ if zinfo.external_attr != 0xA1ED0000:
+ # set timestamp for directories and files but not symlinks
+ dt = time.mktime(zinfo.date_time + (0, 0, -1))
+ os.utime(tgt, (dt, dt))
zf.close()
import sys, os
from getopt import getopt, GetoptError
-from zipfile import ZipFile, ZIP_DEFLATED
+from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED
from m_lib.defenc import default_encoding
def usage():
usage()
def addToZip(zf, path):
- if os.path.isfile(path):
+ if os.path.isfile(path) or os.path.islink(path):
print(path)
if isinstance(path, bytes):
recoded_path = path.decode(default_encoding).encode('cp866')
else:
recoded_path = path
- zf.write(path, recoded_path, ZIP_DEFLATED)
+ if os.path.islink(path):
+ # http://www.mail-archive.com/python-list@python.org/msg34223.html
+ zipInfo = ZipInfo(recoded_path)
+ zipInfo.create_system = 3
+ # say, symlink attr magic...
+ zipInfo.external_attr = 0xA1ED0000
+ zf.writestr(zipInfo, os.readlink(path))
+ else:
+ zf.write(path, recoded_path, ZIP_DEFLATED)
elif os.path.isdir(path):
for nm in os.listdir(path):
addToZip(zf, os.path.join(path, nm))