Here is the video version, if you prefer it:
Today we are going to talk about shell globbing (sometimes referred to as wildcards). They both refer to the same thing (“Globbing vs wildcards,” n.d.), so I will use the names interchangeably, or just stick to wildcards since it is shorter.
Wildcards enable us to specify a set of file names using a shorthand. (Barrett, 2016) Let’s look at an example. Say I had these files:
mislav@mislavovo-racunalo:~/Linux_folder$ ls
aba.txt ab.txt a.txt cb.txt file.txt
Good. And let’s say I wanted to print out the contents of all the files whose filenames start with a
. I could do so the tedious way as follows:
mislav@mislavovo-racunalo:~/Linux_folder$ cat a.txt
mislav@mislavovo-racunalo:~/Linux_folder$ cat aba.txt
mislav@mislavovo-racunalo:~/Linux_folder$ cat ab.txt
The more efficient way of doing this is to write the equivalent of the 3 above statements, which is:
mislav@mislavovo-racunalo:~/Linux_folder$ cat a*.txt
What did I just do here? Am I a magician? Well, not really, so let’s look at what happened.
As I stated above, wildcards enable us to specify a set of file names using a shorthand. With this particular wildcard (a*.txt
), I am saying: “Give me all the filenames that start with a
, have zero or more consecutive characters afterwards, and end with a .txt
”. So in some intermediary step, my command looks like:
mislav@mislavovo-racunalo:~/Linux_folder$ cat aba.txt ab.txt a.txt
Now here is something important – the shell does all of this expansion (this is how it is called – turning a*.txt
to all of the filenames) before it executes the cat
command. So, the expansion of the wildcard is done before the command runs. (Ward, 2014)
Here is a list of wildcards and their meanings; the wildcard and its meaning is delimited with a dash (Barrett, 2016):
*
– zero or more consecutive characters?
– any single character[set]
– any single character in the given set;[abcde]
matches charactersa
,b
,c
,d
ande
, while[a-z]
matches all lowercase characters froma
toz
[^set]
or[!set]
– anything not in the set (both[^set]
and[!set]
have equivalent meaning); i.e.[^1]
is anything but the digit1
There are also some specifics:
- If you want to include a literal dash in the set, put it first or last
- To include a literal closing square bracket in the set, put it first
- To include the
^
or the!
symbol literally, don’t put it first
Thank you for reading and hope you learned something useful!
References
Barrett, D. J. (2016). Linux pocket guide (3rd ed.). O’Reilly Media. Pages 28-30
Globbing vs wildcards. (n.d.). Retrieved January 11, 2020, from https://unix.stackexchange.com/questions/413357/globbing-vs-wildcards
Ward, B. (2014). How Linux Works: What Every Superuser Should Know (2nd ed.). No Starch Press. Page 17