Bash basename Command with Examples
Last updated
Last updated
Let us imagine a situation where we have a Linux file with the absolute path. And we only need the file name. What do we do then? Definitely, we can use the available tools in Bash like sed or awk. But why go to such great lengths when we have a tailor-made tool whose sole purpose is to fetch the final component in the file path. Basename is a command-line tool for removing the directory and trailing suffix from file names. In this tutorial, we will also examine some real-world problems.
The command is flexible. It enables users to provide the syntax in two different manners.
The first looks for a suffix.
There is another syntax for basename. It can consume options. These options can be more than one.
We are prohibited to combine the suffix with the option.
Example:
Basename is a simple tool to implement. All it does is finds the last path separator (/). It displays whatever is present after that. As we can notice, the command is totally unbiased when it comes to files or directories. Its job is to simply give us the information after the final slash.
The major advantage of the command is that it allows multiple inputs as arguments.
Example:
To make the command interpret more than one path, we supply -a. We can also give the --multiple flag. It is used to achieve the same. Then comes a list of files, each separated by a space. In our example, we will get the name of the two files, .bashrc and hosts from their respective paths. These two file names will appear in separate lines. To separate these outputs with NULL rather than a newline we have to pass the -z flag along with it.
As we gathered, the sole role of the bash command is to give us the file name from the path. But if the file name has an extension, we get that too. We can still use the command to get rid of the extension or any suffix. This ensures we end up a clean output of just the name of the file.
Example:
We are aware the command accepts two syntaxes. They are just a different way of writing. In the first one we have to provide the path and the extension we want to be trimmed from the final output. In the latter case, we have the -s option which accepts the extension we want to remove. In both cases, the basename should produce the result "sample.txt". As we have provided the suffix, the output will be trimmed further by removing the .txt from the result. We will get the final output "sample". If we provide an imaginary suffix or one that is not at the end, the outcome remains the same. It will assume there was no suffix.
We can, with certain limitations, combine -s and -a flag to trim extensions from multiple inputs.
Example:
In the first case, we have asked the command to remove the .txt extension from multiple inputs. But there is a loophole. We cannot assign individual suffices. That won’t work. Our hand is forced as we can only provide one suffix to all the file paths. If multiple files with different extensions exist, then it will trim the ones whose extensions match with the supplied. In our case, we get "sample" and "sample.cfg" as the eventual output. They will be separated by a line break.
We have understood that the command is simple enough to try out. Furthermore, it doesn’t have too many options making it relatively easy for challenging problems. We will look at a couple of examples where we will require the use of this command
Very often we will have text files with the extension .txt. Say we want to rename those files with the same name but with a different extension. This is where we have the basename utility at our disposal.
Example:
#!/bin/bashfor
file
in
*txt; doif
[ -f $file
]; then mv
$file
`basename
$file
.txt`.cfgfidone
We are looking for txt files in this example. We have a for loop to operate over each file. We first check if the file exists. If only it exists, we calculate the basename. This is after trimming the original extension. We then move the txt file to the same file name with a .cfg extension.
There is a lot of similarity between URLs and Linux file paths in terms of the nomenclature and the path separators. Both use the slash (\). Basename command also acts on this slash. At times we have a list of URLs and we want to extract the final name and save the results to a file or build a new url with these file names.
Example:
#!/bin/bashurl1="https://www.rediff.com/cricket/report/20230504.htm"
url2="https://www.rediff.com/cricket/report/20230503.htm"url3="https://www.rediff.com/cricket/report/20230502.htm"basename
-a $url1 $url2 $url3 | tee
output.txtwhile
read
linedo echo
https://www.mywebsite.com/myarticles/$linedone
< output.txt
We have a bunch of URLs, from which we are extracting the basename with the extension. We have used the -a flag to have multiple inputs separated by a space. In our case, the inputs are stored in variables. The result of the basename command is stored in output.txt. Now we iterate over the file line by line and display a new set of URLs with the same basename.
We have tabulated the options available with the command.
-a or --multiple
This option supports multiple arguments. We can still provide a single input with the -a or --multiple flag.
-sor--suffix
This option removes a trailing suffix. A popular example is file extension
-z
This option separates the output with NULL instead of a newline.
-version
This displays the version number of the command and exits.
-help
This option is used to show us the information needed if we are stuck somewhere. It is similar to a readme document. It displays the help content and exits.
Basename is a simple enough command with a fixed number of options.
These options can be used with certain limitations.
We usually use it to display the filename with or without the extension.
We have the option to trim the extension from the file name too.