I understand that if you type ls * it is actually expanded to ls a b c when the current directly has files a, b and c.

I was wondering if there is a way to expand this before I hit enter. Similar to how Ctrl+X works, or tab complete works.

So to make myself clear

$ ls *
<press magic key>
$ ls a b c

in a similar way to:

$ ls ~/
<press tab>
$ ls /home/username

I thought I'd seen this before but I might have been mistaken.

  • Well, I know very little but the best I know of is $echo * <ENTER> You could do that before the ls * command. That's not quite hitting tab or a shortcut to expand it of course. – barlop Nov 28 '10 at 19:24
  • But perhaps linux users wouldn't do anything like ls * much 'cos it probably isn't necessary with ls, But also globbing behaves differently on different shells so it's not that portable, but when convenient then fine. But in ls's case, not necessary. ls */ lists directories but not so much what ls is designed to do. – barlop Nov 28 '10 at 19:27

You can use the glob-expand-word function, from man bash:

The word before point is treated as a pattern for pathname
expansion, and the list of matching file names is inserted,
replacing the word. If a numeric argument is supplied, an
asterisk is appended before pathname expansion.

Add something like this to your ~/.inputrc:

Control-x: glob-expand-word

So $ ls * followed by Ctrl-X will expand to $ ls a b c, in your example.

| improve this answer | |
  • 9
    It should already be bound. And Ctrl-x is already bound as a prefix to a bunch of stuff. Do bind -p | grep 'C-x' to see them. – Paused until further notice. Nov 28 '10 at 19:50
  • That's exactly what I was looking for! Thanks – bramp Nov 28 '10 at 19:54
  • @Dennis, it wasn't already bound, but adding it to my .inputrc has. I guess that's Debian's default. – bramp Nov 28 '10 at 19:55
  • 3
    @Dennis: It's bound to C-x* on my system. – cYrus Nov 28 '10 at 19:56

In bash, the readline capability is called glob-expand-word and is bound to CtrlX* by default.

| improve this answer | |

When you are in vi mode (set -o vi), the "magic key" is Esc*. This works with both bash and ksh.

| improve this answer | |
  • Just to be clear to vimmers, first type the asterisk while typing the command line normally, then escape out of edit mode, cursor will locate on the asterisk if you escape immediately, then hit asterisk with the cursor located on the asterisk and the glob will expand and drop you in edit mode again. – NeilG May 23 '19 at 9:50
$ bind -q glob-expand-word
glob-expand-word can be invoked via "\C-x*".

$ bind -q insert-completions
insert-completions can be invoked via "\e*".

So to use these we can do

ls * Ctrl+x *


ls * Esc *

Expand complicated lines before hitting enter

| improve this answer | |
  • This is the best answer because it looks up the exact keybinding, which could be different in different environments. – wisbucky May 4 '18 at 1:07

An alternative to glob-expand-word (\C-x*) is insert-completions (\e*). It works without an asterisk at the end, but it also includes other completions like hidden files. I have rebound both in ~/.inputrc:

# insert glob results (\C-x* by default)
"\C-g": glob-expand-word

# insert completion list (\e* by default)
"\ei": insert-completions

glob-complete-word (\eg) can be used to convert for example /System/Library/Launch*/*Finder to /System/Library/LaunchAgents/com.apple.Finder.plist.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.