Find and Tar a Folder


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Find and Tar a Folder
# 1  
Old 10-14-2011
Find and Tar a Folder

Hi all,

I have created a function that looks for a folder in a particular directory, checks the date it was last modified and if its old then compress it.
This works fine for files using gzip. However for folders I had to use tar. This is my function:

Code:
 
compressOldFolder()
{
  # $1 is the directory to search
  # $2 is the number of days a file must be old by, before it is compressed
 
  # Compress folders that:
  #    Are in/under the specified ($1) directory
  #    Were modified more than ($2) days ago
 
  find $1 -mtime +$2 -type d \( \! -name '*\.gz' \) -exec tar -cvpf {} $1 \;
}

the equivalent funtion for compressing old files uses
Code:
 
find $1 -mtime +$2 -type f \( \! -name '*\.gz' \) -exec gzip -f {} \;

which works fine...

the problem with the tar one is I get an error message saying "Cannot write to a directory"

If I replace "{}" with for eg " Archive1 " then it works fine, however what I want it to do is find the folder and compress it, not create a new separate archive

for example if I have the following directories
Folder1
--Nov2010
--Dec2010

I want the function to compress those two folders to
Folder1
--Nov2010.tar.gz
--Dec2010.tar.gz

(Nov2010 and Dec2010 are located inside Folder1 hence the "--")

any ideas?

thanks for your time!
# 2  
Old 10-14-2011
It's simply a matter of parameters, gzip takes a filename and zips it up replacing the original file with the zipped file and adding the .gz exception.

The tar command on the other hand needs to be told what to save the archive as. The paramter supplied after -f is the archive name.

Last edited by Skrynesaver; 10-15-2011 at 06:17 AM.. Reason: corrected markup
This User Gave Thanks to Skrynesaver For This Post:
# 3  
Old 10-14-2011
Your problem is that you are trying to create a file (archive) with the same name as directory that you are compressing. Remember though, that directories in UNIX are just files, and you cannot create two files with the same name. So basically, you have a name conflict there...

Workaround would be to name archives with some extension like:
Code:
find . -type d -name .... -exec tar -cvpf {}.zipped {} \;

and then delete the dirs and rename the archives. The original dirs can be removed in the same tar command with --remove-files switch, if your version of tar supports it, like:
Code:
find . -type d -name .... -exec tar --remove-files -cvpf {}.zipped {} \;

Then you just need to rename the .zipped archives.

=== EDIT: ===

After rereading your post, i realize all you need is to set the extension. If you invoke your function as
compressOldFolder Folder1

in your example; the find command should be:
Code:
find $1 -mtime +$2 ...<other find options>... -exec tar --remove-files -cvpzf {}.tar.gz {} \;

Because doing
Code:
-exec tar -cvpf {} $1

will try to compress the Folder1 and name the archive Nov2010 (but a file named Nov2010 already exists -- it's the orig dir)

You also want the -z option of tar to create gzipped archive

Last edited by mirni; 10-14-2011 at 08:01 AM.. Reason: -z option missing
This User Gave Thanks to mirni For This Post:
# 4  
Old 10-14-2011
That's because you're telling it to write to a tar file named 'Nov2010' (tar -f <filename>) - tar doesn't automatically add a suffix.

Code:
tar -cvpzf {}.tar.gz

might work
This User Gave Thanks to CarloM For This Post:
# 5  
Old 10-14-2011
Hi all thank you for your replies

I understand what the problem is
However both ways create an archive named "{}.tar.gz" or "{}.zipped"
also -z is not recognized as a perameter ( I use AIX )
I want it to keep the same name so I can have for example

Nov2010 and Nov2010.zipped

the problem is how can I get the function to use the foldername for creating the archive?
# 6  
Old 10-14-2011
iirc AIX tar has a zip option, but I forget what it was...

A simple way could be:
Code:
#!/bin/ksh

for i in $( find $1 -type d -mtime +$2 -print )
do
        tar cpf "$i.tar"  "$i"
        gzip "$i.tar"
done


Last edited by CarloM; 10-14-2011 at 08:31 AM..
This User Gave Thanks to CarloM For This Post:
# 7  
Old 10-14-2011
Thanks for your reply Carlom

it seems to work fine, though it now causes a new problem

-print (or even just find) returns the folders as well as the parent path
for examble if I have Oct2010 and Nov2010 in Folder1 the find will return

Code:
 
home/stuff/Folder1/
home/stuff/Folder1/Oct2010
home/stuff/Folder1/Nov2010

as a result I will then have 3 compressed files
Code:
 
.tar.gz
Oct2010.tar.gz
Nov2010.tar.gz

now I can easily remove the .tar.gz
but if I try to remove the original folders Oct2010 and Nov2010 and keep only the gz files by modifing my code as below

Code:
 
compressOldFolder()
{
  # $1 is the directory to search
  # $2 is the number of days a file must be old by, before it is compressed
 
  # Compress folders that:
  #    Are in/under the specified ($1) directory
  #    Were modified more than ($2) days ago
 
  for i in $( find $1 -type d \( \! -name '*\.gz' \) -print )
  do
          tar cpf "$i.tar"  "$i"
          gzip "$i.tar"
          rm -r $i
 
  done  
 
  mv $1.tar.gz temp
  rm $1temp
 
}

that will aslo remove the parent folder.

I know it is relativly easy to do an ls and grep the folder names then remove them, but I want to keep everything inside the function and keep it simple avoiding complexity. Is there a way to prevent find from returning the current path? (could not find something in man pages)
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Untar only folder structure from a tar ball

I have a tar file hello.tar which is 95 GB. hello.tar has many files and folders including some tar files as well. I wish to create a new tar ball which should maintain only the folder structure of hello.tar and the tar ball within the hello.tar So basically the idea is to untar... (2 Replies)
Discussion started by: mohtashims
2 Replies

2. UNIX for Dummies Questions & Answers

Do I need to extract the entire tar file to confirm the tar folder is fine?

I would like to confirm my file.tar is been tar-ed correctly before I remove them. But I have very limited disc space to untar it. Can I just do the listing instead of actual extract it? Can I say confirm folder integrity if the listing is sucessful without problem? tar tvf file1.tar ... (1 Reply)
Discussion started by: vivien_chu
1 Replies

3. UNIX for Dummies Questions & Answers

Tar-ing folders in a folder

How do I create individual tars of a all the directories in a directory? I have a directory called 'patients', each patient has a directory in the patients directory. I want to create tars such that each patient has their own tar file. Thanks! (5 Replies)
Discussion started by: HappyPhysicist
5 Replies

4. UNIX for Dummies Questions & Answers

tar file from current folder

Hello guys, I am sure this has been asked before, but honestly, I cant find post talking about it. Here is what I need: - A tar file will be generated manually by user - This tar file is then used within a bash shell script My source folder structure is like this: ... (2 Replies)
Discussion started by: manolain
2 Replies

5. Emergency UNIX and Linux Support

Extract particular folder from a .tar format files.

Hi All- I want to extract a particular folder from .tar format files. For example: File Name: backup.tar The backup.tar contains the below folders & files. 1) /root_folder/Folder1/Folder1-1/* 2) /root_folder/Folder1/Folder1-2/* 3) /root_folder/Folder2/Folder2-1/* 4)... (5 Replies)
Discussion started by: k_manimuthu
5 Replies

6. Shell Programming and Scripting

Find folder within folder, then find other folder in same dir

Hi all I'm new to your forum but not new to shells. I'm having a little trouble though as it's been quite some time since I scripted. Here's what I'm trying to do: I'm trying to search a directory named '/var/root/Applications' for another directory 'fooBar'. The "Applications" directory... (9 Replies)
Discussion started by: DC Slick
9 Replies

7. Shell Programming and Scripting

Find all text files in folder and then copy to a new folder

Hi all, *I use Uwin and Cygwin emulator. I´m trying to search for all text files in the current folder (C/Files) and its sub folders using find -depth -name "*.txt" The above command worked for me, but now I would like to copy all found text files to a new folder (C/Files/Text) with ... (4 Replies)
Discussion started by: cgkmal
4 Replies

8. UNIX for Dummies Questions & Answers

tar -cvf test.tar `find . -mtime -1 -type f` only tar 1 file

Hi all, 4 files are returned when i issue 'find . -mtime -1 -type f -ls'. ./ora_475244.aud ./ora_671958.aud ./ora_934052.aud ./ora_934050.aud However, when I issued the below command: tar -cvf test.tar `find . -mtime -1 -type f`, the tar file only contains the 1st file -... (2 Replies)
Discussion started by: ahSher
2 Replies

9. UNIX for Dummies Questions & Answers

Jar/Tar to a diffent folder/same folder w/ filename

Hi, I want to extract myfile.war to a folder which is in the same folder with war file.I did this as normal: jar -xvf myfile.war But it exploded all the content of file to the same level folder instead of that I was expecting to create a folder called myfile. This works with tar: ... (0 Replies)
Discussion started by: reis3k
0 Replies

10. Solaris

extract tar.gz under a specific folder

Hi, How to extract a tar.gz file and put it under a designated folder that I specify in a one line command? thank you in advance. (3 Replies)
Discussion started by: melanie_pfefer
3 Replies
Login or Register to Ask a Question