Skip to content

Instantly share code, notes, and snippets.

@chuckg
Created November 9, 2010 19:20
Show Gist options
  • Save chuckg/669632 to your computer and use it in GitHub Desktop.
Save chuckg/669632 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Copyright 2004 Ben Reser <ben@reser.org>
# Licensed under the terms subversion ships under or GPLv2.
# Useful for greping in a subversion working copy.
# Essentially it behaves the same way your grep command does (in fact it
# ultimately calls the grep command on your path) with a few exceptions.
# Ignores the subversion admin directories (.svn) and vi(m) backup files.
# Recursive is always on with or without -r.
# Always print filename and line numbers.
# Ignores binary files.
# If no path is given the current working directory is searched not stdin.
# Other than that it will take any parameter or pattern your standard grep
# does.
# This script requires GNU findutils and by default GNU grep (though that
# can be changed with environment variables).
#
# Modifications to the original:
# - Modified for use on OSX (use gfind found on Macports) and egrep
# - Added switch to color always
# - Added .git to the hardcoded ignores
#
# There are three environment variables you can set that modify the default
# behavior:
#
# WCGREP_GREP Controls what command is used for the grep command.
# If unset or null wcgrep will use the command named grep.
# WCGREP_GREPARGS Controls what arguments are always passed to the grep
# command before the arguments given on the command line.
# If unset or null it defaults to -HnI (always print file
# names, line numbers and ignore binary files). If you wish
# to set no default args set the variable to a space (" ").
# WCGREP_IGNORE Controls what files are ignored by the grep command.
# This is a regex that is passed to the find command with
# -regex so see find's man page for details. If unset or
# null defaults to '.*~$\|.*/\.svn\(/\|$\)', which will
# ignore vim backup files and subversion admin dirs.
arg_count=$#
for (( i=1; i <= $arg_count; i++ )); do
arg="$1"
shift 1
if [ -z "$pattern" ]; then
if [ "$arg" == "--" ]; then
grepargs="$grepargs $arg"
pattern="$1"
shift 1
((i++))
elif [ "${arg:0:1}" != "-" ]; then
pattern="$arg"
else
grepargs="$grepargs $arg"
fi
else
pathargs="$pathargs $arg"
fi
done
gfind $pathargs -regex ${WCGREP_IGNORE:-'.*~$\|\.\/\.git\|.*/\.svn\(/\|$\)'} -prune -o \
-type f -print0 | gxargs -r0 ${WCGREP_GREP:-egrep} ${WCGREP_GREPARGS:--HnI --color=always} \
$grepargs "$pattern"
@chuckg
Copy link
Author

chuckg commented Dec 31, 2010

Hello breser, spending your time on github searching for wcgrep thieves!? :)

Sorry, I didn't remove anything from the script. I received it second hand from someone at a previous job and I modified it for my purposes and posted it here so it would be lost if I had some disk failure. No foul play intended! I've added back your original copyright and license and added a note about what I changed. Cheers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment