''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 |
