17db96d56Sopenharmony_ci#! /usr/bin/env python3
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci# findlinksto
47db96d56Sopenharmony_ci#
57db96d56Sopenharmony_ci# find symbolic links to a path matching a regular expression
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ciimport os
87db96d56Sopenharmony_ciimport sys
97db96d56Sopenharmony_ciimport re
107db96d56Sopenharmony_ciimport getopt
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_cidef main():
137db96d56Sopenharmony_ci    try:
147db96d56Sopenharmony_ci        opts, args = getopt.getopt(sys.argv[1:], '')
157db96d56Sopenharmony_ci        if len(args) < 2:
167db96d56Sopenharmony_ci            raise getopt.GetoptError('not enough arguments', None)
177db96d56Sopenharmony_ci    except getopt.GetoptError as msg:
187db96d56Sopenharmony_ci        sys.stdout = sys.stderr
197db96d56Sopenharmony_ci        print(msg)
207db96d56Sopenharmony_ci        print('usage: findlinksto pattern directory ...')
217db96d56Sopenharmony_ci        sys.exit(2)
227db96d56Sopenharmony_ci    pat, dirs = args[0], args[1:]
237db96d56Sopenharmony_ci    prog = re.compile(pat)
247db96d56Sopenharmony_ci    for dirname in dirs:
257db96d56Sopenharmony_ci        os.walk(dirname, visit, prog)
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_cidef visit(prog, dirname, names):
287db96d56Sopenharmony_ci    if os.path.islink(dirname):
297db96d56Sopenharmony_ci        names[:] = []
307db96d56Sopenharmony_ci        return
317db96d56Sopenharmony_ci    if os.path.ismount(dirname):
327db96d56Sopenharmony_ci        print('descend into', dirname)
337db96d56Sopenharmony_ci    for name in names:
347db96d56Sopenharmony_ci        name = os.path.join(dirname, name)
357db96d56Sopenharmony_ci        try:
367db96d56Sopenharmony_ci            linkto = os.readlink(name)
377db96d56Sopenharmony_ci            if prog.search(linkto) is not None:
387db96d56Sopenharmony_ci                print(name, '->', linkto)
397db96d56Sopenharmony_ci        except OSError:
407db96d56Sopenharmony_ci            pass
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ciif __name__ == '__main__':
437db96d56Sopenharmony_ci    main()
44