19

When I press tab in a console I get this output

Display all 2957 possibilities? (y or n)

Is there any way to use grep on these 2957 possibilities? I would like to search for all commands with the word "svn" in them.

Jjed
  • 14,064
UAdapter
  • 17,967

6 Answers6

22

The solution is the bash builtin compgen. To grep 'svn' from all available commands and command aliases accessible through $PATH, type.

compgen -ac | grep svn

Want to search from a certain prefix (eg all commands that start with ecrypt)? Use regular expressions..

compgen -ac | grep "^ecrypt"
Jjed
  • 14,064
2

You can try using compgen.

For example:

compgen -ac | grep "svn"
RolandiXor
  • 51,797
1

This should be equivallent:

for x in `echo $PATH | sed 's/:/ /g'`; do ls $x | grep svn; done
totaam
  • 377
1
for i in $(echo $PATH | tr ":" "\n"); do find $i -type f -perm +111; done | grep svn

Very similar to totaam's answer apart from this limits its scope to executables (as Bash does). But JJE's compgen is another mile better.

Oli
  • 299,380
1

maybe {,.}*svn* helps here, e.g. ls -l /usr/bin/{,.}*svn*<tab>.

But, have a look on the Zsh! Here: http://www.jukie.net/bart/blog/zsh-tab-completion are some great examples how it can help to reduce your tab completion results. This includes also negation, e.g. if you want all tab-completion results without the word "foobar", or all results with even digits in the first place, subdirectory tab-completion and much more. The reason why I changed to zsh was history sharing between all open terminals.

math
  • 1,498
0

I didn't knew compgen, and would have suggested:

ls -d ${PATH//:/\/*svn* } 2>/dev/null

for bash.

${VAR//pattern/replace} replaces in VAR pattern with replace. // is used to replace every pattern, not just the first, which would be just /.
user unknown
  • 6,892