I would like to create a tarball that contains files from a directory that have a ctime of less than 30 days. Most tutorials I have found have basically recommended doing something like this:

tar cvf foo.tar $(find ~/POD -type f -ctime -30)

The problem is that a lot of the files that I want to tar up contain spaces in their name. This means that the tar command will delimit based on a spaces, which means that the full file paths will be broken up.

So now I'm trying to make the find command return a list of quoted file paths. So here's what I have tried:

find . -type f -ctime -30  | xargs printf "\"%s\"\n"

But this command also broke up all of the file names based on spaces. So then I tried this:

find . -type f -ctime -30  | xargs printf "\"%s\"\n"

But this gave me the same results.

Is there a way I can pass the full path names to tar and have everything work with spaces in their names?


GNU tar has a -T option to take the list of files from a specified file. I would use find ... -print0 | tar cfzT outfile.tgz - --null so tar receives null-terminated filenames on stdin.


The null terminated output piped to tarsuggested by geekosaur should do the trick, but you can also do this with the -exec option of find. Find knows that this is a tough problem so they solved it, you just have to turn things around backwards from what you first tried to do with tar … $(find …) and use find to call tar instead like this:

find . -type f -ctime -30 -exec tar cfz outfile.tgz {} +
  • 1
    Problem: If the list of files grows too long, tar will run more than once, and outfile.tgz will end up with only the contents of the last run. Go with geekosaur's answer. Jun 4 '11 at 0:21

You almost had it. You need to escape \n like $'\n' to assign a new line to a variable.

oifs=$IFS; IFS=$'\n'; tar cvf foo.tar $(find ~/POD -type f -ctime -30); IFS=$oifs

See the Quoting section of the bash man page for more information.

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.