Is there any way to remove all of the files in a directory except for one with a certain filename? For instance, if I had a directory containing the files file1, file2, and dontdelete. Would there be any way to quickly delete file1, and file2 and not dontdelete? I know that I could just do rm file1 file2 but that wouldn't work for a bunch of files. Also, I'm on Mac OS X if that makes a difference.

  • Simple wildcarding may be your solution: rm file* will remove file1 and file2 but not dontdelete. If your needs are more complex then, depending shell scripting language, you could generate a list of files you want to delete using a regular expression and pipe this to the rm command. Jan 1, 2011 at 4:57
  • @Rob: Yeah, my situation is more complex than that. And Ignacio's answer worked. Thanks, though!
    – Wuffers
    Jan 1, 2011 at 4:59

1 Answer 1


In bash:

shopt -s extglob
rm !(dontdelete)
  • 1
    +1 Wow very succinct solution. Will bear that in mind if I need it. Jan 2, 2011 at 13:17
  • can this be extended to include multiple directories that you don't wan to delete
    – mcgrailm
    Aug 5, 2012 at 12:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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