|  | #! /usr/bin/env python3 | 
|  |  | 
|  | # findlinksto | 
|  | # | 
|  | # find symbolic links to a path matching a regular expression | 
|  |  | 
|  | import os | 
|  | import sys | 
|  | import re | 
|  | import getopt | 
|  |  | 
|  | def main(): | 
|  | try: | 
|  | opts, args = getopt.getopt(sys.argv[1:], '') | 
|  | if len(args) < 2: | 
|  | raise getopt.GetoptError('not enough arguments', None) | 
|  | except getopt.GetoptError as msg: | 
|  | sys.stdout = sys.stderr | 
|  | print(msg) | 
|  | print('usage: findlinksto pattern directory ...') | 
|  | sys.exit(2) | 
|  | pat, dirs = args[0], args[1:] | 
|  | prog = re.compile(pat) | 
|  | for dirname in dirs: | 
|  | os.walk(dirname, visit, prog) | 
|  |  | 
|  | def visit(prog, dirname, names): | 
|  | if os.path.islink(dirname): | 
|  | names[:] = [] | 
|  | return | 
|  | if os.path.ismount(dirname): | 
|  | print('descend into', dirname) | 
|  | for name in names: | 
|  | name = os.path.join(dirname, name) | 
|  | try: | 
|  | linkto = os.readlink(name) | 
|  | if prog.search(linkto) is not None: | 
|  | print(name, '->', linkto) | 
|  | except OSError: | 
|  | pass | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |