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