11

I have workspace with many folders which all are consisted of long paths. For example:

|- workspace
|-- this.is.very.long.name.context
|-- this.is.another.long.path.authors
|-- // 20 more folders
|-- this.is.folder.with.too.many.characters.folder

They all start with same phase (this.is) which in my real case is 20 characters long and they mostly differ in last sequence. Is there any way to quickly navigate through them using cd command? Any wild characters like ??

1
  • 2
    If this happens often you may want to give fzf a shot. I rarely just cd anymore; with fzf installed, typing Alt-C and then a few characters from anywhere in the filename works very well.
    – user339730
    Aug 1, 2020 at 10:43

4 Answers 4

30

I can't speak for others (e.g., zsh) but if you are using bash, wildcards do work to an extent.  Example:

~ $ ls
Documents
Desktop
Downloads

If you use an asterisk (*), you get:

~ $ cd *ments
~/Documents $

That's because bash can do the substitutions before the command ever gets to cd.

In the case of cd, if multiple matches work, you would expect the behaviour to be undefined:

~ $ cd *s
bash: cd: too many arguments

bash expands this to cd Documents Downloads, which doesn't make sense to cd.


You can also rely on bash's autocomplete.  In your example, you can simply type cd t; then hitting Tab will auto-complete to: cd this.is. or whatever the next ambiguous character is.  Hit Tab a second time to see all options in this filtered set.

You can repeat by entering another character to narrow it down, Tab to autocomplete to the next ambiguous character, and then Tab to see all options.


Going further, bash can handle wildcards in autocomplete. In the first case above, you can type cd D*s then hit Tab to get suggestions of what could match the pattern:

~ $ cd D*s
Documents/ Downloads/
~ $ cd D*s

If only one match exists, it'll get completed for you.

~ $ cd *loads
~ $ cd Downloads/

You could also use ls if you don't mind being in the questioned directory. The -d tells ls to list directories themselves instead of their contents.

$ ls -d *long*
this.is.very.long.name.context
this.is.another.long.path.authors

or you could use find if you want to look recursively:

$ find workspace -type d -name '*long*'
workspace/this.is.very.long.name.context
workspace/this.is.another.long.path.authors
3
  • 6
    "I can't speak for others (e.g. zsh)" while zsh has the same behavior here, it also gets rid of the problem entirely by autocompleting anywhere in the string, not just the beginning.
    – lights0123
    Jul 27, 2020 at 14:55
  • 1
    Note that "ls long" will display the contents of any directories, not the directory names themselves. "ls -d long" will give the output suggested here.
    – UncleCarl
    Jul 27, 2020 at 15:19
  • 3
    Adding to bash's autocomplete: You can also type cd *word*<TAB> and bash will autocomplete to the first entry (in directory order, I assume) matching that pattern (no list of options popping up here, sadly).
    – orithena
    Jul 27, 2020 at 16:45
5

With zsh, you can configure the completion system with zstyles so it complete words in the middle.

The compinstall function can assist you with that. Run it as autoload compinstall; compinstall for instance. It's also available through the zsh-newuser-install menu often invoked upon first use of zsh (when you don't have a .zshrc yet).

               *** compinstall: main menu ***
2.  Matching control: set behaviour for case-insensitive matching,
    extended (partial-word) matching and substring matching.
              *** compinstall: matcher menu ***

`Matchers' compare the completion code with the possible matches in some
special way.  Numbers in parentheses show matchers to be tried and the order.
The same number can be assigned to different matchers, meaning apply at the
same time.  Omit a sequence number to try normal matching at that point.
A `+' in the first line indicates the element is added to preceding matchers
instead of replacing them; toggle this with `t'.  You don't need to set
all four, or indeed any matchers --- then the style will not be set.

   (    )   `+' indicates add to previous matchers, else replace
n. (    ) No matchers; you may want to try this as the first choice.
c. (    ) Case-insensitive completion (lowercase matches uppercase)
C. (    ) Case-insensitive completion (lower/uppercase match each other)
p. (    ) Partial-word completion:  expand 'f.b' to 'foo.bar', etc., in one go.
          You can choose the separators (here `.') used each time.
s. (    ) Substring completion:  complete on substrings, not just initial
          strings.  Warning: it is recommended this not be used for element 1.

If you make it just:

   (    )   `+' indicates add to previous matchers, else replace
n. (1   ) No matchers; you may want to try this as the first choice.
c. (    ) Case-insensitive completion (lowercase matches uppercase)
C. (    ) Case-insensitive completion (lower/uppercase match each other)
p. (    ) Partial-word completion:  expand 'f.b' to 'foo.bar', etc., in one go.
          You can choose the separators (here `.') used each time.
s. ( 2  ) Substring completion:  complete on substrings, not just initial
          strings.  Warning: it is recommended this not be used for element 1.

and save and exit, you'll see compinstall added this line to your ~/.zshrc:

zstyle ':completion:*' matcher-list '' '' '' 'l:|=* r:|=*'

info zsh matcher-list (note: you may need to install a zsh-doc package) will tell you how that works.

Then if you type cd anoTab, you'll see it being completed to this.is.another.long.path.authors assuming there's no file whose name starts with ano.

I invite you to go through all the compinstall menus as there's a lot more amazing features in there you can enable. (same for zsh-newuser-install).

0

Just copy and paste the part that you need.

-1

Use a backslash. This is an escape character, which tells the computer to treat the space literally. Here is an example:

cd My\ Documents
3
  • 1
    This doesn't answer the question, which is not asking about whitespace in path names nor escaping.
    – grg
    Jul 28, 2020 at 16:21
  • Welcome, @Bitecofer! You will likely get down-voted because your response does not answer the OP, even though it is relevant to using a cd command and is helpful in some contexts. You will notice that the OP doesn't have spaces in their example directory names and thus your response is not helpful in this instance. Again, welcome to the platform and may you bless others and be blessed through it.
    – Brandon
    Jul 28, 2020 at 16:24
  • @Bitecofer, also, if you delete your response after it has been downvoted, you will get a badge--something called "Peer Pressure" or something like that. I learned that through experience. ;)
    – Brandon
    Jul 28, 2020 at 16:26

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .