You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.5 KiB
51 lines
1.5 KiB
#!/usr/bin/env python3 |
|
# (c) 2015 Taeyeon Mori |
|
|
|
from animeimport import transport_path |
|
|
|
import argparse |
|
import os |
|
import sys |
|
import errno |
|
|
|
|
|
def resymlink(target, location, dir, dir_fd): |
|
try: |
|
os.unlink(location, dir_fd=dir_fd) |
|
except FileNotFoundError: |
|
pass |
|
if os.path.isabs(target): |
|
os.symlink(target, location, dir_fd=dir_fd) |
|
else: |
|
os.symlink(transport_path(target, dir, location), location, dir_fd=dir_fd) |
|
|
|
|
|
def main(argv): |
|
parser = argparse.ArgumentParser(prog=argv[0], description=""" |
|
Move symbolic link targets (Does not move the files, only changes referencing symlinks) |
|
""") |
|
parser.add_argument("source_anchor", help="Old path") |
|
parser.add_argument("target_anchor", help="New path") |
|
|
|
args = parser.parse_args(argv[1:]) |
|
|
|
sa_len = len(args.source_anchor) |
|
|
|
for root, dirs, files, root_fd in os.fwalk(): |
|
print("CHDIR %s" % root) |
|
for fname in files: |
|
try: |
|
target = os.readlink(fname, dir_fd=root_fd) |
|
except OSError as e: |
|
if e.errno == errno.EINVAL: |
|
continue # not a symlink, don't touch it |
|
raise |
|
else: |
|
if target.startswith(args.source_anchor): |
|
newtarget = args.target_anchor + target[sa_len:] |
|
print(" LINK '%s' => '%s'" % (fname, newtarget)) |
|
resymlink(newtarget, fname, root, root_fd) |
|
|
|
if __name__ == "__main__": |
|
sys.exit(main(sys.argv)) |
|
|
|
|