blob: b924f27b095eb0704678121bca87017aca0fc754 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossumec758ea1991-06-04 20:36:54 +00002
3# findlinksto
4#
Guido van Rossum5ec8b521994-01-21 15:47:00 +00005# find symbolic links to a path matching a regular expression
Guido van Rossumec758ea1991-06-04 20:36:54 +00006
Guido van Rossum5ec8b521994-01-21 15:47:00 +00007import os
8import sys
Andrew M. Kuchlingd6835042003-02-06 19:55:35 +00009import re
Guido van Rossum5ec8b521994-01-21 15:47:00 +000010import getopt
Guido van Rossumec758ea1991-06-04 20:36:54 +000011
Guido van Rossum5ec8b521994-01-21 15:47:00 +000012def main():
Tim Peters70c43782001-01-17 08:48:39 +000013 try:
14 opts, args = getopt.getopt(sys.argv[1:], '')
15 if len(args) < 2:
Andrew M. Kuchlingd6835042003-02-06 19:55:35 +000016 raise getopt.GetoptError('not enough arguments', None)
Guido van Rossumb940e112007-01-10 16:19:56 +000017 except getopt.GetoptError as msg:
Tim Peters70c43782001-01-17 08:48:39 +000018 sys.stdout = sys.stderr
Collin Winter6afaeb72007-08-03 17:06:41 +000019 print(msg)
20 print('usage: findlinksto pattern directory ...')
Tim Peters70c43782001-01-17 08:48:39 +000021 sys.exit(2)
22 pat, dirs = args[0], args[1:]
Andrew M. Kuchlingd6835042003-02-06 19:55:35 +000023 prog = re.compile(pat)
Tim Peters70c43782001-01-17 08:48:39 +000024 for dirname in dirs:
Alexandre Vassalotti4e6531e2008-05-09 20:00:17 +000025 os.walk(dirname, visit, prog)
Guido van Rossum5ec8b521994-01-21 15:47:00 +000026
27def visit(prog, dirname, names):
Tim Peters70c43782001-01-17 08:48:39 +000028 if os.path.islink(dirname):
29 names[:] = []
30 return
31 if os.path.ismount(dirname):
Collin Winter6afaeb72007-08-03 17:06:41 +000032 print('descend into', dirname)
Tim Peters70c43782001-01-17 08:48:39 +000033 for name in names:
34 name = os.path.join(dirname, name)
35 try:
36 linkto = os.readlink(name)
Andrew M. Kuchlingd6835042003-02-06 19:55:35 +000037 if prog.search(linkto) is not None:
Collin Winter6afaeb72007-08-03 17:06:41 +000038 print(name, '->', linkto)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +020039 except OSError:
Tim Peters70c43782001-01-17 08:48:39 +000040 pass
Guido van Rossumec758ea1991-06-04 20:36:54 +000041
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000042if __name__ == '__main__':
43 main()