Add the treediff script
This commit is contained in:
parent
4b36f8d790
commit
f602a2eb7b
77
treediff.py
Normal file
77
treediff.py
Normal file
@ -0,0 +1,77 @@
|
||||
#! /usr/bin/env python
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
def main(src, dst, sort_by_size):
|
||||
if src.endswith("/"):
|
||||
src = src[:-1]
|
||||
if dst.endswith("/"):
|
||||
dst = dst[:-1]
|
||||
|
||||
# parse the dst tree
|
||||
dst_tree = {}
|
||||
for root, dnames, fnames in os.walk(dst):
|
||||
root = root.replace(dst, "", 1)
|
||||
for fname in fnames:
|
||||
path = os.path.join(root, fname)
|
||||
try:
|
||||
dst_tree[fname].add(path)
|
||||
except KeyError:
|
||||
dst_tree[fname] = set()
|
||||
dst_tree[fname].add(path)
|
||||
|
||||
# parse the src tree
|
||||
filelist = []
|
||||
for root, dnames, fnames in os.walk(src):
|
||||
root = root.replace(src, "", 1)
|
||||
for fname in fnames:
|
||||
path = os.path.join(root, fname)
|
||||
paths = dst_tree.get(fname)
|
||||
|
||||
if not paths:
|
||||
# file not found
|
||||
try:
|
||||
size = os.path.getsize(os.path.join(src, path[1:]))
|
||||
except OSError:
|
||||
size = 0L
|
||||
filelist.append((size, path))
|
||||
else:
|
||||
# fname found
|
||||
if path in paths:
|
||||
# exact match
|
||||
continue
|
||||
else:
|
||||
# partial match
|
||||
# TODO
|
||||
continue
|
||||
|
||||
if sort_by_size:
|
||||
filelist.sort(reverse=True)
|
||||
|
||||
for size, path in filelist:
|
||||
# convert size to human readable
|
||||
human = ""
|
||||
for base in ["KiB", "MiB", "GiB"]:
|
||||
size /= 1024
|
||||
if size < 1024:
|
||||
human = "{0:6.1f}{1}".format(size, base)
|
||||
break
|
||||
|
||||
print("{0} {1}".format(human, path))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
src, dst = sys.argv[1], sys.argv[2]
|
||||
except IndexError:
|
||||
print("invalid arguments count")
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
sort_by_size = sys.argv[3]
|
||||
except IndexError:
|
||||
sort_by_size = False
|
||||
|
||||
main(src, dst, bool(sort_by_size))
|
Loading…
Reference in New Issue
Block a user