Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am looking for a way to do something that can find all files less than size except filenames with an extension or more. May be more than one.

find . -type f -size -20M -name /! -name *.mp3 -delete

From some of the things I found online I thought that this would be what I was looking for but it is not working. Pretty much I am looking for this

find . -type f -size -/+ size (except) *.ext -delete

What do you think?

share|improve this question
up vote 0 down vote accepted

! is the find not operator. So to exclude files ending in .ext from the results, include the term ! -name \*.ext.

For numeric arguments such as file size, a prefix of + means greater than and a prefix of - means less than. So to find a file larger than 12 kilobytes (really kibibytes) and smaller than 500 Megabytes (really Mebibytes), include the terms -size +12k and -size -500M.

Your second example would then look something like this.

find . -type f -size +12k -size -500M ! -name \*.ext -delete
share|improve this answer
Thank you so much. I use it to clean up a folder automatically for me. so if I wanted to not delete multiple extensions would it be find . -type f -size +12k -size -500M ! -name *.ext *.ext -delete – natethegreat141990 Apr 16 '14 at 0:30
A file name with one or more extensions contains at least one dot, so it would match the pattern *.*. A file name with two or more extensions contains at least two dots, so it would match the pattern *.*.*. If you want to make sure that each extension contains at least one character, you could replace those patterns with *.?* and *.?*.?*, respectively. It really depends on the file names you're dealing with. You want a pattern no more complicated than necessary to distinguish one set of files from the other. And of course test it before using it to delete anything. – garyjohn Apr 16 '14 at 1:18
sorry there is a space between those. I was meaning *.ext and *.ext? – natethegreat141990 Apr 16 '14 at 19:29
If you want to delete only those files whose extension is not .ext and is not .ext?, then you could use find ... ! -name \*.ext ! -name \*.ext\\? -delete. Note that if that extension really contains a question mark, the question mark will have to be escaped so that it is seen by find as a literal question mark and not as the symbol for "any single character". – garyjohn Apr 16 '14 at 21:02

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.