Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

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 wish to tar all files in a directory and its subdirectories that do NOT end in .jpg, .bmp, .gif, or png.

So, given the following folders and files:


I want to tar only the files file.txt and file. file.gif and image.jpg should be ignored. I would also like to maintain the folder structure.

My first thought was to pipe the results of the find command in conjunction with grep -v ".jpg|.gif|.bmp.png" to a text file, and then use the tar include argument to feed it that list of files.

However, the results of the grepped find command also contain directories (in the example above, it would be "foo" and "foo/bar"), and when a directory is fed to tar, it includes all files in that directory, so I would end up with a tar file containing all of the files--not what I want.

Is there any way to prevent find from outputting directories? Is there a far easier way to approach this?

share|improve this question
While John's solution is much more elegant (and most likely more efficient), if you want to only list files using find, you can use the type argument with the parameter f as follows: find -type f | egrep -v "bmp|png|gif|jpg" – Alan Jun 26 '11 at 16:48
up vote 4 down vote accepted

Use --exclude=pattern option:

tar --exclude='*.jpg' --exclude='*.png' --exclude='*.bmp' --exclude='*.gif' -cvf tar-filename.tar folder
share|improve this answer
I knew I was overcomplicating things. Thanks. – Alan Jun 26 '11 at 16:06

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .