]>
code.delx.au - monosys/blob - hacks/apple-time-machine-symlink.py
3 # This tool tries to parse the weird hardlink format Apple uses for Time Machine
4 # The goal is to recover data from a Time Machine backup without a Mac
11 def find_lookup_dir(path
):
13 lookup_dir
= os
.path
.join(path
, ".HFS+ Private Directory Data\r")
14 if os
.path
.isdir(lookup_dir
):
16 path
= os
.path
.split(path
)[0]
17 raise Exception("Could not find HFS+ link dir")
19 def resolve_path(lookup_dir
, path
):
21 if stat
.S_ISREG(st
.st_mode
) and st
.st_size
== 0 and st
.st_nlink
> 1000:
22 return os
.path
.join(lookup_dir
, "dir_%d" % st
.st_nlink
)
27 def process_directory(lookup_dir
, dest
, path
):
28 if os
.path
.islink(dest
):
30 if not os
.path
.isdir(dest
):
32 path
= resolve_path(lookup_dir
, path
)
34 for filename
in os
.listdir(path
):
35 full_filename
= os
.path
.join(path
, filename
)
36 full_filename
= resolve_path(lookup_dir
, full_filename
)
37 dest_filename
= os
.path
.join(dest
, filename
)
39 if os
.path
.isdir(full_filename
):
40 process_directory(lookup_dir
, dest_filename
, full_filename
)
42 if os
.path
.islink(dest_filename
):
43 os
.unlink(dest_filename
)
44 if not os
.path
.isdir(dest_filename
):
45 os
.symlink(full_filename
, dest_filename
)
48 lookup_dir
= find_lookup_dir(path
)
49 process_directory(lookup_dir
, dest
, path
)
51 def print_usage_exit():
52 print >>sys
.stderr
, "Usage: %s dest path" % sys
.argv
[0]
55 if __name__
== "__main__":
56 if len(sys
.argv
) != 3: