-3

I have script for finding files of certain type and compress them to a single tar archive and put in to other place. But now, there is a change in requirement, that I need to find files of certain type, list it and compress each of them to a tar archive and put it to other place. Currently I'm using the script

cd /to/top/of/dir/structure
tar -cf /path/to/tarfile.tar --files-from /dev/null # trick to create empty tar file
find . -type f ! -name '*.log' -print0 | xargs -0 tar -uvf /path/to/tarfile.tar

which I have taken from this post : https://superuser.com/questions/436441/copy-every-file-with-a-certain-extension-recursive

So, the above script find certain file type and then archive it as single tar file and then place it to another location. But my question is, I need to find files of certain type, list them, tar each of the listed files and put them into other location.

FELDAP
  • 939
  • 2
  • 10
  • 22
  • What do you mean by list it? – user9517 Jan 23 '13 at 12:51
  • Like, finding the files of certain types and list them using stdout in console or store it in a file. – FELDAP Jan 23 '13 at 12:53
  • so you want to make a list of the files that you have put in the tar file ? – user9517 Jan 23 '13 at 12:57
  • No, after finding the files of certain type, I would like to list it and then tar each of the listed files to a certain location. – FELDAP Jan 23 '13 at 12:59
  • ...but you are already doing that, no? Are you saying you want to handle multiple types of file? If so, add more `find` statements to your script -- they will be run sequentially – jimbobmcgee Jan 23 '13 at 13:01
  • Ok, files are listed. But the thing is, the above script will only make a single tar archive of all the listed files. But I need to make tar archive of each listed files. Hope you got my point :) – FELDAP Jan 23 '13 at 13:05
  • A tar of each file (file1.tar, file2.tar,...,filen.tar)? Or a tar of each group of files (*.log, *.tmp,...,*.etc)? – jimbobmcgee Jan 23 '13 at 13:08
  • A tar of each file. (File.tar, tile2.tar, ...,filen.tar). – FELDAP Jan 23 '13 at 13:09
  • Any particular reason? You know `tar` doesn't strictly *compress*, right (unless you add `-z` for a gzip file)? You might be better off with straight gzip for a per-file approach – jimbobmcgee Jan 23 '13 at 13:11
  • 4
    A tar of each file doesn't make any sense. If you want to compress the files, use `gzip` instead of `tar`. – Sven Jan 23 '13 at 13:12
  • Ok. As per your recommendation, gzip is good. But how do I implement or modify the script to do so? I'm new to scripting. – FELDAP Jan 23 '13 at 13:16

4 Answers4

3

I'm going with...

cd /to/top/of/dir/structure
find . -type f ! -iname '*.log' -exec gzip -c {} \> /path/to/gzips/\`basename {}\`.gz \;

...but I haven't tested it.

And I'm really dubious it will be what you really need...


Edit

I can get it as far as...

find /path/to/top-level -iname "*.log" -printf "gzip -c %p > /path/to/gzips/%f.gz\n"

...to output the commands you would want to run.

I'm still working on executing those commands, short of -fprinting to a temp file, chmod +x and executing that.

Not to mention dealing with any issues escaping awkward characters in filenames.


Edit #2

OK, I can't get it down to one line (which was my challenge, not yours), but I can get it into a fairly simple script:

#!/bin/bash

function compress_file {
  BASENAME=`/bin/basename "$1"`;
  /bin/gzip -c "$1" > /path/to/gzips/$BASENAME.gz;
}

export -f compress_file;
/bin/find /path/to/top-level -iname "*.log" -exec /bin/bash -c 'compress_file "$0"' {} \;
export -fn compress_file;
jimbobmcgee
  • 2,675
  • 4
  • 27
  • 43
3

Without a pipe (or xargs), creating several tar files instead of just one, and deleting the non-compressed files, here is how you can do it:

find /path/to/files -name "*.ext" -type f -exec tar -czf {}.tar.z {} \; -exec rm {} \;
Falcon Momot
  • 25,244
  • 15
  • 63
  • 92
1

Find the files and build a list, tell tar to make an archive from the list....

find /path/to/files -name "*.ext" | tar cJfTP /path/to/archive.txz -

Side note: your example doesn't compress the file, it just archives it.

Chris S
  • 77,945
  • 11
  • 124
  • 216
0

find . -type f ( -name ".php" -o -name ".js" -o -name ".css" -o -name ".crt" -o -name ".htm*" -o -name ".txt" -o -name ".$" -o -name ".xml" -o -name ".ht" ) -print0 | tar -czpf $FILE --null -T -