When working out a bash script I might want to get just the base name of a path to a file or folder, one way to do so might be to use the linux cut command, but there is also the linux basename command that can be used for this task. The command works by passing a single argument to the command that should be a string value of a path to a file, the result that will be spit out to the standard output will then just be the base name of the path. So then this is a fairly basic command, but when it comes to writing bash scripts, or using it in conjunction with other scripts things might get a little confusing. So I thought I would write a quick post on this command, and also a few other commands that might end up being used in conjunction with it. Also there is making mentioning of some alternatives to using the basename command such as the linux cut command, and tools that there are to work with in programing environments such as the path module in nodejs.
In this section I will be starting out with just some basic examples of the basename command. There is just using the command by itself with a given path, and then there is also looking into some of the options that do not require that much more effort.
To start of with there is just calling the name name and typing in the path to a file as the first and only argument to the command. The result that will be spit out to the standard output of the command line should just then be the base name of the path and nothing more. So if I give an absolute path to a text file, then the result will just be the name of the text file with the file extension.
So that is all fine and good, but when it comes to some kind of real use case example I am going to want to feed the path to the file to the base name command from the output of another command, a shell or environment variable, or some other kind of data from a file or something to that effect. So I think some additional examples are called for here.
In this section I will be getting into some examples that involve piping, and the xargs command as a way to pipe one or more paths to the basename command to get a collection of base names for each path piped in. The input can be created from a long list of commands but for this section I will be sticking to using the Linux echo command as a way to simulate some input. In other real use case examples this input could be some data in a file or something to that effect.
So now when it comes to getting into using the basename command with other commands this is a good time to write about another very useful command called xargs. Most of the time I can pipe something into a command from the standard output of another command, but it would seem that I can not do that with the basename command.
In this example I am once again using the Linux echo command to simulate a collection of paths in the from of some text where a line feed is used as a separator between each path. When it comes to piping this to the basename command I can use the -a option of the basename command as a way to get what would be a typically desired result in this kind of situation.
Another command that I might want to use with basename is the Linux find command that I can use to look for files that fit a given pattern. This command is then a way to produce a kind of input that is a collection of paths to files that I can then pipe into basename with the xargs command, or one way and other call basename for each file found that fits a given patten. So then in this section I will once again be doing something lie the section in which I am using echo, but now this is a way to generate some real data that might change a little.
When it comes to using the find command there is an exec option that allows for me to define a command to run for each file path found that fits the pattern. This can then be used as a way to get just the base name of each file found.
Although something like this might work to just get the base name for a file, I might still also want to have the full path at the ready also. See I might want just the base name to make some kind of comparison, but once I have that done I might want to do something with the full path to the file also. So it might be called for at some point to get into writing a few more examples that have to do with writing a bash script or two.
Another option would be to once again use the -a option of th basename command along with xargs and forget about the exec option of the find command.