The rm command lets you delete a file or directory passing its name: “rm filename” or “rm -d directory.” You can include a directory path, too. If there are files in the directory, use the -r option “rm -r directory” to delete files and folders recursively.
rm command deletes files and directories. To use this tool safely, you need to be certain what’s going to happen when you hit “Enter.” Here’s what you need to know.
rm command is primarily for deleting files. It’s one that most people encounter soon after they start using Linux. Just by virtue of being a newcomer to Linux, you’re likely to make mistakes. You’ll create or copy files by accident, or with the wrong name, or to the wrong place. It’s all part of the learning curve of the command line. The clean-up operations for such mistakes involve
rm command can delete files, groups of files, directories, or complete directory trees. That’s why it must be used with caution. Using
rm isn’t difficult, but the penalty for failure is high.
When a file is deleted with
rm , it is gone. It isn’t moved to the trash. It is obliterated immediately. That doesn’t mean you should avoid using
rm . But to use it safely, you need to be aware of what it can do, and ensure you’re using it properly.
Some tools are more dangerous than others, and far less forgiving of mistakes. That’s why there’s never been a movie called The Texas Wrench Massacre.
rm isn’t a wrench, it’s definitely a chainsaw.
People use chainsaws all day everyday, and as long as they use one responsibly and mindfully, they’re fine. It’s the same deal with
rm . When you pull
rm out of your tool bag, you ought to slow down and check, then double-check, your command line.
rm command is an executable, it’s not part of the shell. So, although we’re using Bash here, it’s the standard Linux
rm, not a special Bash
The simplest way to use
rm is to provide the name of a file you want to delete.
You’re silently returned to the command line.
rm adopts the classic, close-lipped Linux stance that if it doesn’t complain about anything, you can assume it did what you asked. Providing a filename like this causes
rm to look for the file in the current working directory.
You can provide multiple file names on the command line. You can also provide a directory path if a file you want to delete isn’t in the current directory.
rm memlog.sh /home/dave/dev-archive/config.gc
Again, nothing is reported if
rm manages to delete the specified files.
Wildcards allow you to specify groups or collections of files without having to list the individual files on the command line.
The asterisk “
*” represents any sequence of characters, including none. The question mark “
?” represents any single character.
To check that your wildcards are going to match what you expect them to, and nothing more, you can use them with ls before you use them with rm.
To delete all of the PNG files in the current directory, use “*.png.” This means any sequence of characters followed by “.png” will be matched. When the files have been deleted, we can use
ls to verify that they’ve gone.
On our test computer, we’ve got two files in the current directory with names starting with “config.”
We’re able to delete both of these by using the asterisk wildcard. It matches both files because
rm is looking for filenames that start with “config”, followed by any sequence of characters. On one file, that sequence of characters is “.sl3”, the filename extension. The other filename has no characters after “config”, but because the asterisk matches any characters or no characters, it matches that filename too.
You can use the question mark in pairs. This will delete files that have file extensions of two characters exactly.
A safe way to use
rm is to force it to ask for confirmation before it deletes each file. The
-i (interactive) option lets you do this. When you add this option to your command line,
rm will prompt you before each deletion, giving you a chance to step over actions you hadn’t intended.
We’ll use the
-i (interactive) option in this command. It tries to delete all files with a single character file extension.
rm -i *.?
Each matching file is presented in turn. If you answer “y” or “Y” the file is deleted. If you answer “n”, the file is retained. In fact, if you answer with anything other than “y” or “y”, the file is retained. You can just hit “Enter” and the file is retained.
You can quickly work through your list of files, deleting or skipping over files to cherry-pick the ones you want to remove. As we’ll see you can use the
i- (interactive) option with other
If you try to delete a file that is read-only,
rm prompts you for confirmation before it deletes the file. That’s a good safety net, but one that could become tedious if you have a lot of files to delete.
-f (force) option instructs
rm to never prompt. You’re telling it “Yes, delete all files that you would normally prompt me about.” It also prevents
rm from complaining about non-existent files.
rm -f geonames.sl3
-f (force) option is often used when you’re deleting a nested set of files and directories.
rm command can optionally remove directories too, along with the files they contain. This is similar to the
rmdir command, but
rmdir cannot delete directories with files in them. It only deletes empty directories. The
rm command can easily delete directories that contain files and other directories.
Deleting a directory is similar to deleting a file. We provide the name of the directory on the command line. We need to include the
-d (directory) option. Like we did when we were deleting files, we can provide the name of several directories. We can provide a path to directory that is not in the current working directory.
rm -d old-projects
If the directory contains files, this will fail.
To delete a directory and its contents, use the
-r (recursive) flag. This deletes the directory, its files, and any nested directories it contains.
rm -d archive
rm -r archive
The second command succeeds.
rm into full-on chainsaw mode, we can combine the
-r (recursive) and
-f (force) options. This tells
rm to recursively delete all files and directories in a directory tree, even if they are read-only, and without ever prompting us.
On our test computer, we’ve got a directory called “migrated code.” It contains files and another directory called “6502.” The “6502” directory also contains files and another directory called “ASM.” There’s files in that directory, too. Some of the files are read-only.
We’ll also include the
-v (verbose) command so that
rm tells us what it is doing.
rm -rfv migrated-code
In the output we can see that the files are removed and, when they’re empty, the directories are removed too.
Spaces and other weird characters in filenames can present problems. Filenames that start with a hyphen “
-” for example, can be mistaken for command line options. If we have a file called “-contributors.txt”,
rm will try to process the name as a sequence of command line options.
rm doesn’t have an option called “
-c“, the command line parsing fails and the file isn’t deleted. To delete the file you need to precede it with “./” to provide a path to it.
Spaces in filenames are also problematic. Either quote the entire filename, or use tab completion to insert the name of the file onto the command line for you, escaping the spaces as it does so. If you don’t use either of these options,
rm will treat each portion of the filename as an individual file.
Here, we’ve got two files, one called “backup” and one called “backup to delete.” We can demonstrate the problem with these file names, using
ls. If we try to use
ls on the “backup to delete” file and we don’t escape or quote the file name, the command fails.
ls -hl backup to delete
ls complains that it can’t find files called “to” or “delete”, but it does find a file called “backup.” That’s what
rm will do, too. It’ll complain about two missing files, and it’ll then delete the file called “backup”, which isn’t what we wanted.
rm backup to delete
rm thinks it is working with three files, “backup”, “to”, and “delete.” It complains that it can’t find “to” and “delete”, but it finds and silently deletes “backup.”
Quoting the filename allows
rm to delete the correct file.
rm 'backup to delete'
You could also escape the spaces with backslashes “
\“, like this:
rm backup\ to\ delete
If you use tab completion to enter your filenames, they’ll be automatically escaped, if required.
Unlike real-world chainsaws, there’s no personal protective equipment you can use with
What you can do, is check your syntax with
ls before you try it with
rm, and use the interactive mode so that you get to decide what gets deleted.
Other than that, it’s practice until you feel comfortable and confident. The safest way to do that is to copy a bunch of sacrificial files to a directory and practice on those.