How to expand * on Bash command line

34

9

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.

bramp

Posted 2010-11-28T19:12:35.397

Reputation: 458

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 – 2010-11-28T19:24:14.983

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 – 2010-11-28T19:27:40.690

Answers

19

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.

cYrus

Posted 2010-11-28T19:12:35.397

Reputation: 18 102

8It 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. – 2010-11-28T19:50:13.307

That's exactly what I was looking for! Thanks – bramp – 2010-11-28T19:54:03.193

@Dennis, it wasn't already bound, but adding it to my .inputrc has. I guess that's Debian's default. – bramp – 2010-11-28T19:55:08.420

3@Dennis: It's bound to C-x* on my system. – cYrus – 2010-11-28T19:56:11.593

23

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

Ignacio Vazquez-Abrams

Posted 2010-11-28T19:12:35.397

Reputation: 100 516

11

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

jlliagre

Posted 2010-11-28T19:12:35.397

Reputation: 12 469

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 – 2019-05-23T09:50:09.973

4

$ 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 *

or

ls * Esc *

Expand complicated lines before hitting enter

Steven Penny

Posted 2010-11-28T19:12:35.397

Reputation: 7 294

This is the best answer because it looks up the exact keybinding, which could be different in different environments. – wisbucky – 2018-05-04T01:07:41.017

0

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.

Lri

Posted 2010-11-28T19:12:35.397

Reputation: 34 501