12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- import argparse
- import os
- import stat
- import tarfile
- def parse_args():
- parser = argparse.ArgumentParser()
- parser.add_argument('--exts', nargs='*', default=None)
- parser.add_argument('--flat', action='store_true')
- parser.add_argument('--input', required=True)
- parser.add_argument('--output', required=True)
- parser.add_argument('--prefix', default=None)
- return parser.parse_args()
- def main():
- args = parse_args()
- compression_mode = ''
- if args.output.endswith(('.tar.gz', '.tgz')):
- compression_mode = 'gz'
- elif args.output.endswith('.bzip2'):
- compression_mode = 'bz2'
- with tarfile.open(args.output, 'w:{}'.format(compression_mode)) as out:
- for root, dirs, files in os.walk(args.input, topdown=True):
- dirs.sort()
- for name in sorted(files):
- fname = os.path.join(root, name)
- if args.exts and not fname.endswith(tuple(args.exts)):
- continue
- arcname = os.path.basename(fname) if args.flat else os.path.relpath(fname, args.input)
- if args.prefix:
- arcname = os.path.join(args.prefix, arcname)
- with open(fname, 'rb') as fin:
- tarinfo = out.gettarinfo(fname, arcname)
- tarinfo.mode = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH if tarinfo.mode | stat.S_IXUSR else 0
- tarinfo.mode = (
- tarinfo.mode | stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH
- )
- tarinfo.mtime = 0
- tarinfo.uid = 0
- tarinfo.gid = 0
- tarinfo.uname = 'dummy'
- tarinfo.gname = 'dummy'
- out.addfile(tarinfo, fin)
- if __name__ == '__main__':
- main()
|