diff --git a/vcsh b/vcsh
index fef3bc8af29ca1e8124fa37e3897a85ffbdf4cbb..e8fefbb5a39d1d025f2dc76ce0b2ffbf4d73b0ee 100755
--- a/vcsh
+++ b/vcsh
@@ -183,6 +183,14 @@ use() {
 	export VCSH_DIRECTORY="$VCSH_REPO_NAME"
 }
 
+which() {
+	for VCSH_REPO_NAME in $(list); do
+		for VCSH_FILE in $(get_files); do
+			echo $VCSH_FILE | grep $VCSH_COMMAND_PARAMETER > /dev/null && echo "$VCSH_REPO_NAME: $VCSH_FILE"
+		done
+	done | sort -u
+}
+
 write_gitignore() {
 	use
 	cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11
@@ -225,6 +233,11 @@ if [ "$1" = 'clone' ]; then
 	[ -n "$3" ] && VCSH_REPO_NAME="$3" || VCSH_REPO_NAME=$(basename "$GIT_REMOTE" .git)
 	export VCSH_REPO_NAME
 	export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
+elif [ "$1" = 'which' ]; then
+	[ -z "$2" ] && fatal "$1: please specify a filename" 1
+	[ -n "$3" ] && fatal "$1: too many parameters" 1
+	export VCSH_COMMAND="$1"
+	export VCSH_COMMAND_PARAMETER="$2"
 elif [ "$1" = 'delete' ]           ||
      [ "$1" = 'enter' ]            ||
      [ "$1" = 'init' ]             ||