... character after the asterisk:
$ ls 123 a.txt b.txt c.txt dont-delete-me important-file passwords $ rm * .txt DANGER!! Don't run this! Deletes the wrong files!
The most common solution to this hazard is to alias rm
to run rm -i
so it prompts for confirmation before each deletion:
$ alias rm='rm -i' Often found in a shell configuration file $ rm *.txt /bin/rm: remove regular file 'a.txt'? y /bin/rm: remove regular file 'b.txt'? y /bin/rm: remove regular file 'c.txt'? y
As a result, an extra space character needn’t be fatal, because the
prompts from rm -i
will warn that you’re removing the wrong files:
$ rm * .txt /bin/rm: remove regular file '123'? Something is wrong: kill the command
The alias solution is cumbersome, however, because most of the time
you might not want or need rm
to prompt you. It also doesn’t work if
you’re logged into another Linux machine without your aliases. I’ll
show you a better way to avoid matching the wrong filenames with
a pattern. The technique has two steps and relies on history expansion:
-
Verify. Before running
rm
, runls
with the desired pattern to see which files match.$ ls *.txt a.txt b.txt c.txt
-
Delete. If the output of
ls
looks correct, runrm !$
to delete the same files that were matched.2$ rm !$ rm *.txt
The history expansion !$
(“bang dollar”) means “the final word that
you typed in the previous command.” Therefore, rm !$
here is
shorthand for “delete whatever I just listed with ls
,” namely,
*.txt
. If you accidentally add a space after ...
Get Efficient Linux at the Command Line now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.