Remove All Files Except a Few in Bash
How can remove most of the files in a directory in Bash?
$ ls -1
153390909910_first
15339090991_second
15339090992_third
15339090993_fourth
15339090994_fifth
15339090995_sixth
15339090996_seventh
15339090997_eighth
15339090998_nineth
15339090999_tenth
15339091628_do_not_delete
root
root.sql
We want to delete all files that start with a timestamp (seconds since
the epoch), except the newest file (15339091628_do_not_delete
) and the
files root
and root.sql
. The easiest way to do this, is enabling the
shell option extglob
(“extended globbing”), which allows us to use
patterns to include or exclude files of operations:
$ shopt -s extglob
$ rm !(*do_not_delete|root*)
The last command will tell Bash to remove all files, except the ones
that match either one of the patterns (everything ending with
do_not_delete
and everything starting with root
). We delimit the
patterns by using a pipe character |
.
Other patterns that are supported by extglob
include:
?(pattern-list)
Matches zero or one occurrence of the given patterns
\*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns
To disable the extended globbing again:
$ shopt -u extglob
References
To read about all the options that extglob
gives you, refer to man bash
(search for Pathname Expansion). Searching for shopt
in the
same manual page will turn up all shell options. To see which shell
options are currently enables for your shell, type shopt -p
at the
prompt.