Delete files with regular expression
Solution 1
You can use the following command to delete all files matching your criteria:
ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm
How it works:
ls
lists all files (one by line since the result is piped).-
grep -P "^A.*[0-9]{2}$"
filters the list of files and leaves only those that match the regular expression^A.*[0-9]{2}$
.*
indicates any number of occurrences of.
, where.
is a wildcard matching any character.[0-9]{2}
indicates exactly two occurrences of[0-9]
, that is, any digit.
xargs -d"\n" rm
executesrm line
once for everyline
that is piped to it.
Where am I wrong?
For starters, rm
doesn't accept a regular expression as an argument. Besides the wildcard *
, every other character is treated literally.
Also, your regular expression is slightly off. For example, *
means any occurrences of ...
in a regular expression, so A*
matches A
, AA
, etc. and even an empty string.
For more information, visit Regular-Expressions.info.
Solution 2
Or using find
:
find your-directory/ -name 'A*[0-9][0-9]' -delete
This solution will deal with weird file names.
Solution 3
See the filename expansion section of the bash man page:
rm A*[0-9][0-9]
Solution 4
find
command works with regexes as well.
Check which files are gonna to be deleted
find . -regex '^A.*[0-9]{2}$'
Delete files
find . -regex '^A.*[0-9]{2}$' -delete
Solution 5
This works on my mac:
rm $(ls | grep -e '^A*[0..9]2$')
Related videos on Youtube
Comments
-
gdoron is supporting Monica over 1 year
I Tried to delete files that starts with A and ends with 2 numbers but It doesn't do a thing.
What I tried:rm ^A*[0..9]2$
Where am I wrong?
-
Frg over 12 yearsThe
-d"\n
switch fixes the spaces problem. -
bluescrubbie over 10 yearsNote - some distros (like Mac OS) don't have a
grep -P
(Perl regex).grep -E
may work in this case. -
jozxyqk about 10 yearsI prefer using
-I
withxargs
and always test with non-lethal commands first:xargs -d"\n" -I {} echo "{}"
-
JAMESSTONEco about 9 yearsThis is a great solution. I prefer it because it is simpler and you can omit the -delete flag at the end first to see if your regex is correct before mass deleting your files.
-
Marco Sulla about 8 yearsFurthermore you have more control on what you delete, for example adding
-type f
-
Kamil Maciorowski over 7 yearsParsing
ls
? See this question which points to this article. Because of the pitfalls you mayrm
what you don't want to. -
8bittree over 7 years@Frg Beware of newlines in file names. Or other strange characters.
-
8bittree over 7 yearsThis doesn't seem to add much beyond what Dennis's 4 year old answer already says.
-
Nishanth Matha over 7 yearsworked nicely for me.
-
glenn jackman over 7 years"200 times" is a pretty specific. Lots of other commands are very powerful too, all you need to do is learn how to use them.
-
Alex almost 7 yearsCan this be used to delete files and folders? It does not work for non empty folders.
-
cYrus almost 7 years@Alex nope, the directory must be empty (it wasn't an OP requirement anyway), you can use the
xargs
approach withrm -f
. -
Janac Meena over 6 yearsThis was the simplest, yet complete answer to the question.
-
αғsнιη over 5 yearsthis won't work if
ls
orgrep
aliased with--color=always
option and you will need to do\ls | \grep ...
-
Itay almost 5 yearsWill this work if the folder has a lot of files?
-
qwr over 4 yearsalso obligatory link to article about parsing ls
-
qwr over 4 yearsThis is not the most robust solution (spaces in filenames), especially considering
find
does all this in one command. -
Gergely Lukacsy almost 4 yearsThis one doesn't work in it's current form. You need to define
-regextype egrep
to make{x,y}
type quantifiers work.