rm *.xvg will only delete files ending with
.xvg in your current directory. Here's why.
When you type a command like this, work is split up between the shell you are using (let's assume bash) and the command binary.
You can locate the binary by typing
which rm. This little program takes care of unlinking files. Programs like this can be started from the command line and can read a list of arguments
prog arg1 arg2 arg3 when they start up. In the case of
rm, they are interpreted as a list of fully qualified filenames to be deleted. So if you are in a directory containing the file
delete 'foo.*' will result in
rm: foo.*: No such file or directory. Note the single quotes around the file pattern, they tell the shell to pass the argument to the shell as it is.
However if you type
rm *.bar in the same directory, it will delete the file. What's happening here is that your shell, which is the program you are using to type in commands, is performing some transformations before passing the arguments on to the command. One of these is called 'file name expansion', otherwise know as 'globbing'. You can see a list of bash file name expansions here. One of the most common expansions is
*, which is expanded to filenames in the current directory.
A simple way to look at globs at work is to use
echo, which prints back all arguments passed to it through the shell. So typing
echo * in the same directory will output
foo.bar. So when you type
rm *.bar, what's actually happening is that the shell expands the argument list to
foo.bar, then passes that to the
There are some ways of controlling globbing. In recent versions of bash, for example, you can turn on an option called globstar which will do recursive expansion. Typing
echo **/*.bar will show a list of all files ending in
.bar in all subfolders. So typing
rm **/*.bar in globstar enabled bash will indeed recursively delete all matching files in subfolders.