Tips For Linux

>> Wildcards, Quotes, Back Quotes and Apostrophes in shell commands ( * ? [] " ` ')

This article deals with 2 issues which are many a times used with each other. The first one is about wildcards and the other one is the use of special characters while typing commands at the shell prompt.

I call this a Special Guide since the information in this article helps you with many of your commands and is not restricted to any particular application as such. Thus reading this article is a must for all Linux users.


In Linux whenever you are not sure about the name of a file and you want to do something with files such as either search for them or copy them or delete some files based on some knowledge you have about the filenames then you can use Wildcards. Wildcards are basically an indicator to the shell that some particular part of the filename is not known to you and the shell can insert a combination of characters in those places and then work on all the newly formed filenames. This concept would be clear by the end of this article

There are 3 types of wildcards that can be used Linux. They are the * ? and [] . All the 3 shall be explained in detail.

* (Asterisk) Wildcard

This represents any sequence of characters. This means that if you include a * in your filename then that part of the filename can be formed using any sequence of characters. The example below explains this concept

$ cat article* > combinedarticle
Would find all the files that begin with the letter sequence ' article ' and can have anything following those letters. I mean article01 or article10 or articlenew.. and any such file would be considered. All these files would be merged and would be written to a file named combinedarticle

$ ls *gif
Would list all the files having the letters ' gif ' in them. So a file named somegifs.txt as well as a file named 123.gif would be listed in the output.

$ ls *.gif
Would list all the files having ' gif ' as the extension of their filename. Thus in this case a file named somegifs.txt file would NOT be listed since its extension is not ' gif '. Whereas a file named 123.gif would be listed.

$ ls *day*
Would list all the files that have the letters ' day ' anywhere in their filenames. Thus files such as today.txt , dayone.txt and lastday.gif would all be listed in the output.

$ ls .*gif*
Would list all the hidden files in the current directory that have the letters ' gif ' in their filenames. Hidden files in Linux begin with a . (period) in their filenames.

$ pl * a.txt
Notice that there is a space between the * and ' a.txt ' . It is this space that causes the command to act as if 2 parameters have been passed to ' pl ' rather than one. The above command would print all the files that are present in the current directory. Once that is done it would proceed to the next file named a.txt and would print that also if it exists.

Note : The * would not work with the ' . ' (period) that exists in filenames. Thus in case you use ' *a ' and there is a file whose name begins with ' .a ' , it would not be listed. When a . (period) is the first character in a filename then the file becomes a hidden file in Linux.


? (Question Mark) Wildcard

This represents only one character which can be any character. Thus in case you know a part of a filename but not one letter, then you could use this wildcard. If there are many files that are named such as article10, article11 and so on till article19 you could get all these files by using article1? . In this case the ? would be interpreted as any one character and it would find all the files like article10, article11..and so on till article19, since all these files differ in their names by only the last letter.

$ ls article1?
Would list all the files that begin with ' article1 ' and have one more character in their names which can be any one valid character.

$ ls ??.gif
Would list all the .gif files in the current directory that have only 2 characters before the extension. Thus files such as ab.gif or xy.gif would be listed but 123.gif would not be listed

Remember that the ? means any ONE character to be substituted in the place of the ?

$ ls *.???
Would list all the files in the current directory that have a file extension of 3 characters in length. Thus files having extensions such as .gif , .jpg , .txt would be listed.


[] (Square Brackets) Wildcard

This represents a range of characters. So in case you have files that are named article10, article11, article12..all the way till article19 then you could select all the first 5 of them using the above wildcard as shown below

$ ls article1[0-4]
Remember that [] represents a range from which any character can be present. This range can be something like [0-4] or [1-9] or anything like that in case of numbers. Letters could also be selected such as [a-g] or [F-Z] or [A-Z].

Note : Remember that in Linux the filenames are case sensitive, Thus a range of [a-z] is different from [A-Z]

$ ls beckham[123].jpg
Would list all the files that begin with the letter sequence ' beckham ' and end with either a 1, 2 or 3. Thus the possible filenames that could be listed (if they exists) are beckham1.jpg , beckham2.jpg and beckham3.jpg

$ ls [a-d,A-D]*.jpg
This would list all the files that have an extension as .jpg and have as their first letter either a,b,c,d,A,B,C or D . The [ , ] imply that this entire range indicates ONLY ONE letter which can be from any of the two given sub-ranges. A comma is used to merge different range of letters or numbers.

Note : I would once again like to mention that [a-d,p-z] does NOT mean that there can be two letters, the first one from a to d and the second one from p to z. It means that there is ONLY ONE letter, and that letter can be from either a to d or from p to z.

In case you want to specify the range for 2 characters in the filenames then use the following as follows
$ ls beckham[0-9][0-9]

Read the second part of this article to know about the use of special characters such as quotes and apostrophe marks.

Goto Page 2 of this article

Tips For Linux © All Copyrights Reserved