98

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?

gdoron
  • 1,100

6 Answers6

109

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:

  1. ls lists all files (one by line since the result is piped).

  2. 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.

  3. xargs -d"\n" rm executes rm line once for every line 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.

Dennis
  • 50,701
83

Or using find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

This solution will deal with weird file names.

cYrus
  • 22,335
21

See the filename expansion section of the bash man page:

rm A*[0-9][0-9]
glenn jackman
  • 27,524
4

This works on my mac:

rm $(ls | grep -e '^A*[0..9]2$')

Ray
  • 41
  • 1
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
Petr Javorik
  • 234
  • 1
  • 3
2

The solution with regexp is 200 times better, even with that you can see which file will be deleted before using the command, cutting off the final pipe:

ls | grep -P "^A.*[0-9]{2}$"

Then if it's correct just use:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

This is 200 times better because if you work with Unix it's important to know how to use grep. It's very powerful if you know how to use it.

Gareth
  • 19,080