''find' with 'xargs' and 'tar'

I have the following I want to do:

find . -maxdepth 6 \( -name \*.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra \) -prune -o -print | tar  cvf somefile.tar --files-from=-

I.e., exclude a whole lot of stuff, only look to six subdirectories depth, and then once pruning is done, 'tar' up the rest.

It is not hard. The bit before the pipe (|) works 100%. If I exclude the 'tar', then I get what I'm after (to the screen). But once I include the pipe, and the tar, it tars everything, including all the stuff I've just excluded in the 'find'.

I've tried a number of different iterations:

-print0 | xargs -0 tar rvf somefile.tar
-print0 | xargs -0 tar rvf somefile.tar --null --files-from=-
-print0 | tar cvf somefile.tar --null -T -

So what am I doing wrong? I've done this before; but now it's just giving me grey hairs.



Solution 1:[1]

A combination of the -print flag for find, and then --files-from on the 'tar' command worked for me. In my case I needed to tar up 5000+ log files, but just using 'xargs' only gave me 500 files in the resulting file.

find . -name "*.pdf" -print | tar -czf pdfs.tar.gz --files-from -

You have "--files-from=-", when you just want "--files-from -" and then I think you need a - in front of cvf, like the following.

find . -maxdepth 6 ( -name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra ) -prune -o -print| tar -cvf somefile.tar.gz --files-from -

Solution 2:[2]

I remember doing something like the below line to 'tar' a bunch of files together. I was specific about the files I wanted to group, so I ran something like this:

find . -name "*.xyz" | xargs tar cvf xyz.tar;

In your case, I wonder why you are doing "-o" before the -print that seems to be including everything again.

Solution 3:[3]

If your 'find' is returning directories, then those will be passed to 'tar', and the full contents will be included, regardless of the exclusions in your 'find' command.

So, I think you need to include a "-type f" in the 'find'.

Solution 4:[4]

I use a combination of the two previous approaches. To backup a day's work I do this:

rm -rf new.tgz; find . -type f -mtime 0 | xargs tar cvf new.tgz;

Solution 5:[5]

To use files-from without an option was the only way to make it work for me. All other options included all files in the directory rather than my generated list.

This was my solution:

find . ! -name '*.gz' -print | xargs tar cvzf ../logs.tar.gz --files-from

Solution 6:[6]

This work for me, where ARG can be any name var

find . -name "*.tar.gz" -print | xargs -I ARG tar -xvzf ARG

...

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Peter Mortensen
Solution 2 Peter Mortensen
Solution 3 Peter Mortensen
Solution 4 Peter Mortensen
Solution 5 Peter Mortensen
Solution 6 Louis Loudog Trottier