-
-
Save amitsaha/3759263 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
"""myfind | |
Usage: | |
myfind.py [--directory=<dir>] [--pattern=<p>] [--text=<text>] | |
myfind.py -h | --help | |
myfind.py --version | |
Examples: | |
myfind.py | |
lists all files in the current directory | |
myfind.py --directory='/home/gene' --pattern='*.py' | |
lists all .py files in /home/gene | |
myfind.py --directory='/home/gene' --pattern='*.py' --text='spam'' | |
lists all .py files in /home/gene containing the text spam | |
Options: | |
-h --help Show this screen. | |
--directory=<dir> Directory to start searching (default: .) | |
--pattern=<p> Files to look for (default: *.*) | |
--text=<text> Text to search for (default: 'None') | |
""" | |
from docopt import docopt | |
import os | |
import fnmatch | |
# do the walk | |
def walk(starthere, lookfor): | |
for (root, dirs, files) in os.walk(starthere,followlinks=True): | |
for fname in files: | |
if fnmatch.fnmatch(fname,lookfor): | |
yield(os.path.realpath(os.path.join(root,fname))) | |
if __name__ == '__main__': | |
arguments = docopt(__doc__, version='myfind v0.001') | |
if arguments['--directory']: | |
starthere = os.path.abspath(arguments['--directory']) | |
else: | |
starthere = '.' | |
if arguments['--pattern']: | |
lookfor = arguments['--pattern'] | |
else: | |
lookfor = '*' | |
if arguments['--text']: | |
text = arguments['--text'] | |
else: | |
text = None | |
for filename in walk(starthere,lookfor): | |
if text is not None: | |
try: | |
with open(filename,'r') as f: | |
if text in f.read(): | |
print filename | |
except IOError: | |
# permission/link followup failure, etc | |
pass | |
else: | |
print filename |
Hey,
You recently wrote a response to my linux journal article (which I will respond to at some point very soon when I get a minute)
Thought I would write some alternatives to what your program is doing but first let me say something else. This seems like a really nice effort and is a perfectly valid way to solve the problem.
so for the use cases u list in the source:
myfind.py --> ls
myfind.py --directory='/home/gene' --pattern='.py' --> ls *.py
myfind.py --directory='/home/gene' --pattern='.py' --text='spam'' --> grep -r "spam" *.py
Often a good grounding in the various gnu utilitys such as cat, head, tail, grep and even some sed can come in very handy.
Keep up the good work.
There was a problem with the formatting of the previous comment,
the second example should read:
myfind.py --directory='/home/gene' --pattern='_.py' --> ls _.py
Note, that syntax for defaults should use square brackets—
[default: *.*]
, not(default: *.*)
.