| 
563
 | 
     1 #!/usr/bin/env python
 | 
| 
 | 
     2 
 | 
| 
 | 
     3 """
 | 
| 
 | 
     4 grep through multiple directories
 | 
| 
 | 
     5 """
 | 
| 
 | 
     6 
 | 
| 
 | 
     7 # TODO: use a python grep implemention v subshell (probably)
 | 
| 
 | 
     8 
 | 
| 
 | 
     9 import optparse
 | 
| 
 | 
    10 import os
 | 
| 
 | 
    11 import subprocess
 | 
| 
 | 
    12 import sys
 | 
| 
 | 
    13 
 | 
| 
 | 
    14 def main(args=sys.argv[1:]):
 | 
| 
 | 
    15 
 | 
| 
 | 
    16     # CLI
 | 
| 
 | 
    17     usage = '%prog [options] PATTERN DIRECTORY [DIRECTORY] [...]'
 | 
| 
 | 
    18     parser = optparse.OptionParser(usage=usage, description=__doc__)
 | 
| 
 | 
    19     parser.add_option('-f', '--files', dest='files', default='*',
 | 
| 
 | 
    20                       help="file pattern [DEFAULT: %default]")
 | 
| 
 | 
    21     parser.add_option('-g', '--grep', dest='grep',
 | 
| 
 | 
    22                       action='append', default=[],
 | 
| 
 | 
    23                       help="`grep` command [DEFAULT: grep]")
 | 
| 
 | 
    24     parser.add_option('-p', '--print', dest='print_commands',
 | 
| 
 | 
    25                       action='store_true', default=False,
 | 
| 
 | 
    26                       help="print grep commands to run and exit")
 | 
| 
 | 
    27     options, args = parser.parse_args(args)
 | 
| 
 | 
    28     if len(args) < 2:
 | 
| 
 | 
    29         parser.print_help()
 | 
| 
 | 
    30         parser.exit()
 | 
| 
 | 
    31     options.grep = options.grep or ['grep']
 | 
| 
 | 
    32     pattern, directories = args[0], args[1:]
 | 
| 
 | 
    33 
 | 
| 
 | 
    34     # verify directories
 | 
| 
 | 
    35     missing = [i for i in directories
 | 
| 
 | 
    36               if not os.path.isdir(i)]
 | 
| 
 | 
    37     if missing:
 | 
| 
 | 
    38         sep = '\n  '
 | 
| 
 | 
    39         parser.error("Not a directory:%s%s" % (sep, sep.join(missing)))
 | 
| 
 | 
    40 
 | 
| 
 | 
    41     # build command line
 | 
| 
 | 
    42     command = options.grep[:]
 | 
| 
 | 
    43     command.extend([pattern, options.files])
 | 
| 
 | 
    44     cwd = os.getcwd()
 | 
| 
 | 
    45 
 | 
| 
 | 
    46     if options.print_commands:
 | 
| 
 | 
    47         # print grep commands
 | 
| 
 | 
    48         for directory in directories:
 | 
| 
 | 
    49             print "cd %s; %s" % (repr(directory), subprocess.list2cmdline(command))
 | 
| 
 | 
    50         print "cd %s" % (repr(cwd))
 | 
| 
 | 
    51         parser.exit()
 | 
| 
 | 
    52 
 | 
| 
 | 
    53     # loop through directories
 | 
| 
 | 
    54     for directory in directories:
 | 
| 
 | 
    55         print directory
 | 
| 
 | 
    56         subprocess.call(subprocess.list2cmdline(command),
 | 
| 
 | 
    57                         cwd=directory,
 | 
| 
 | 
    58                         shell=True)
 | 
| 
 | 
    59 
 | 
| 
 | 
    60 if __name__ == '__main__':
 | 
| 
 | 
    61     main()
 |