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:
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
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 "--")
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.
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:
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:
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
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?
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
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)