I frequently need to find a file that is located deep within the current directory and operate on it -- like opening in vim or svn diffing it. I can never remember the exact path to the file, and sometimes can't even remember the full name. All I know is that the file is somewhere within the current directory and its sub-directories. So, I end up running the UNIX find command, and then cut-pasting the returned file path into the command of the interest. This wastes time. So I wrote a small python script to make it easier.
Enter the number of the file you are interested in. That will bring up the following menu of operations you can perform on the selected file.
If the pattern you specify matches only a single file, the script directly jumps to the operation selection menu. Hope this will save you some key-strokes.
Copy the script f.py (located at the end of the post) into some directory that is on your PATH. Suppose you are looking for the file that starts with Foo, you just run:
$ f.py Foo* 1) ./subdir1/subdir2/Foo1.java 2) ./subdir1/Foo.java Enter file number:
Enter the number of the file you are interested in. That will bring up the following menu of operations you can perform on the selected file.
Process ./subdir1/subdir2/Foo1.java 1. vim 2. emacs 3. svn add 4. svn diff 5. open (OSX only) Enter choice (Default is 1):
If the pattern you specify matches only a single file, the script directly jumps to the operation selection menu. Hope this will save you some key-strokes.
#!/usr/bin/python # This program is used to easily locate a file matching # the user specified pattern within the current directory # and to quickly perform some common operations (like # opening it in vim) against it. import subprocess import sys import os def processFile(fileName): """ Show the user the possible actions with the specified file, and prompt the user to select a particular action. """ fileName = fileName.strip() print "Process %s" % fileName print "1. vim" print "2. emacs" print "3. svn add" print "4. svn diff" print "5. open (OSX only)" choice = raw_input("Enter choice (Default is 1):").strip() if choice == "1" or choice == "": cmd = "vim %s" % fileName elif choice == "2": cmd = "emacs %s" % fileName elif choice == "3": cmd = "svn add %s" % fileName elif choice == "4": cmd = "svn diff %s" % fileName elif choice == "5": cmd = "open %s" % fileName print cmd os.system(cmd) def listFiles(fileNames): """ Show the list of files and prompt user to select one """ fileIndex = 1 for fileName in fileNames: print "%d) %s" % (fileIndex, fileName.strip()) fileIndex += 1 choice = raw_input("Enter file number:") chosenFileName = fileNames[int(choice)-1].strip() processFile(chosenFileName) if __name__ == "__main__": if len(sys.argv) < 2: print "Usage: f.py FILE_PATTERN_OF_INTEREST" sys.exit(-1) pattern = sys.argv[1] proc = subprocess.Popen("find . -name \"%s\" | grep -v svn" % pattern, shell=True, stdout=subprocess.PIPE) lines = proc.stdout.readlines() if len(lines) == 0: print "No matching files found. Note you can use wild cards like *" elif len(lines) == 1: processFile(lines[0]) else: listFiles(lines)