findlinksto.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #! /usr/bin/env python3
  2. # findlinksto
  3. #
  4. # find symbolic links to a path matching a regular expression
  5. import os
  6. import sys
  7. import re
  8. import getopt
  9. def main():
  10. try:
  11. opts, args = getopt.getopt(sys.argv[1:], '')
  12. if len(args) < 2:
  13. raise getopt.GetoptError('not enough arguments', None)
  14. except getopt.GetoptError as msg:
  15. sys.stdout = sys.stderr
  16. print(msg)
  17. print('usage: findlinksto pattern directory ...')
  18. sys.exit(2)
  19. pat, dirs = args[0], args[1:]
  20. prog = re.compile(pat)
  21. for dirname in dirs:
  22. os.walk(dirname, visit, prog)
  23. def visit(prog, dirname, names):
  24. if os.path.islink(dirname):
  25. names[:] = []
  26. return
  27. if os.path.ismount(dirname):
  28. print('descend into', dirname)
  29. for name in names:
  30. name = os.path.join(dirname, name)
  31. try:
  32. linkto = os.readlink(name)
  33. if prog.search(linkto) is not None:
  34. print(name, '->', linkto)
  35. except OSError:
  36. pass
  37. if __name__ == '__main__':
  38. main()