wyatt12
asked on
a somehwat complex shell script to find old files and remove them
Hi,
I need a shell script to look for subdirectories of data older then 90 days and delete them.
I have this trick command, but its not quite what I need.
find /usr/home/eddie/users -atime +90 -name '*' -exec rm -f {} \;
The problem is that this command looks at all files, and not directories. Nor does it look at the correct place to delete directories. Here is why.
Within /usr/home/eddie/users I have thousands of sub-directories that look like this... (these can't be deleted)
drwxr-x--- 3 www eddie 512 Nov 4 07:06 u_zf
drwxr-x--- 5 www eddie 512 Dec 4 16:53 u_zg
drwxr-x--- 37 www eddie 1536 Dec 3 06:07 u_zh
and within these sub-directories I have sub-directories that look this...
drwxr-x--- 6 www eddie 512 Sep 16 06:06 zhug3499@pop_173_com
drwxr-x--- 6 www eddie 512 Oct 8 04:58 zhu43ng_1234@pop_153_com
drwxr-x--- 6 www eddie 512 Aug 12 06:12 zhy43420@pop_164_com
These sub-directories (example: /usr/home/eddie/users/u_zh /zhy43420@ pop_164_co m) are the ones whose date the script should look at, and if older then 90 days, then delete the directory and all the data within it.
The script could be very dangerous if written incorrectly, or for some reason goes crazy... If one could put in any protections to guard against a mistake, that would also be a big help.
Any help would be much appreciated. Should be easy for a "find" expert.
Wyatt
I need a shell script to look for subdirectories of data older then 90 days and delete them.
I have this trick command, but its not quite what I need.
find /usr/home/eddie/users -atime +90 -name '*' -exec rm -f {} \;
The problem is that this command looks at all files, and not directories. Nor does it look at the correct place to delete directories. Here is why.
Within /usr/home/eddie/users I have thousands of sub-directories that look like this... (these can't be deleted)
drwxr-x--- 3 www eddie 512 Nov 4 07:06 u_zf
drwxr-x--- 5 www eddie 512 Dec 4 16:53 u_zg
drwxr-x--- 37 www eddie 1536 Dec 3 06:07 u_zh
and within these sub-directories I have sub-directories that look this...
drwxr-x--- 6 www eddie 512 Sep 16 06:06 zhug3499@pop_173_com
drwxr-x--- 6 www eddie 512 Oct 8 04:58 zhu43ng_1234@pop_153_com
drwxr-x--- 6 www eddie 512 Aug 12 06:12 zhy43420@pop_164_com
These sub-directories (example: /usr/home/eddie/users/u_zh
The script could be very dangerous if written incorrectly, or for some reason goes crazy... If one could put in any protections to guard against a mistake, that would also be a big help.
Any help would be much appreciated. Should be easy for a "find" expert.
Wyatt
I would use a Perl script instead of a shell script. Perl is very powerful when it comes to string processing, and recognizing the sub-dirs that need to be deleted is a perfect case for Perl. I'll try to come up with something.
Here are a few resources that show similar concepts in Perl. Please let me know if you are familiar with Perl.
http://www.infocopter.com/perl_corner/scr-delete-older-than.htm
http://aspn.activestate.com/ASPN/Mail/Message/perl-unix-users/1880104
http://www.icthus.net/CGI-City/tut_delfiles.shtml
http://www.winnetmag.com/Articles/Print.cfm?ArticleID=8799
http://www.gknw.com/nwperl/perlscripts/cleanup.txt
http://www.infocopter.com/perl_corner/scr-delete-older-than.htm
http://aspn.activestate.com/ASPN/Mail/Message/perl-unix-users/1880104
http://www.icthus.net/CGI-City/tut_delfiles.shtml
http://www.winnetmag.com/Articles/Print.cfm?ArticleID=8799
http://www.gknw.com/nwperl/perlscripts/cleanup.txt
>These sub-directories (example: /usr/home/eddie/users/u_zh /zhy43420@ pop_164_co m) are the ones whose
>date the script should look at,
you mean only at second level or all levels after second level
>date the script should look at,
you mean only at second level or all levels after second level
ASKER
only at the second level..
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
With the finf command you should be able to do something like:
find /usr/home/eddie/users/*/*
This will only find directories which are in the subdirectories of 'users', not those subdirectories themselves.
find /usr/home/eddie/users/*/*
This will only find directories which are in the subdirectories of 'users', not those subdirectories themselves.
Here is a dirty and inflexible way ... but should be reasonably safe and should work here
find -maxdepth 2 /usr/home/eddie/users/ -name '*' -type d | sed 's:/[^/]*/[^/]*/[^/]*/[^/] */[^/]*/$: :' | sed '/^$/d' > dir_list
I know sed with d could have been used in the first place but for some strange reason, it is not working (may be my mind is numb of CVing)
find will give us *directories* of type
/usr/home/eddie/users/a/
or
/usr/home/eddie/users/a/b/
this script will eliminate all entries of the former type (it counts the number of / )
we have all second level directories with atime > 90 in dir_list ... all you need to do now is
for i in `cat dir_list`
do
rm -rf $i
done
rm -f dir_list
so overall script
========================== ========== ========== ========== ========== ==========
find -maxdepth 2 /usr/home/eddie/users/ -name '*' -type d | sed 's:/[^/]*/[^/]*/[^/]*/[^/] */[^/]*/$: :' | sed '/^$/d' > dir_list
for i in `cat dir_list`
do
rm -rf $i
done
rm -f dir_list
========================== ========== ========== ========== ========== ==========
NOTE :::: I have not run this script on my machine ... I would recommend running only the find command first and verifying if the list is what you want
find -maxdepth 2 /usr/home/eddie/users/ -name '*' -type d | sed 's:/[^/]*/[^/]*/[^/]*/[^/]
I know sed with d could have been used in the first place but for some strange reason, it is not working (may be my mind is numb of CVing)
find will give us *directories* of type
/usr/home/eddie/users/a/
or
/usr/home/eddie/users/a/b/
this script will eliminate all entries of the former type (it counts the number of / )
we have all second level directories with atime > 90 in dir_list ... all you need to do now is
for i in `cat dir_list`
do
rm -rf $i
done
rm -f dir_list
so overall script
==========================
find -maxdepth 2 /usr/home/eddie/users/ -name '*' -type d | sed 's:/[^/]*/[^/]*/[^/]*/[^/]
for i in `cat dir_list`
do
rm -rf $i
done
rm -f dir_list
==========================
NOTE :::: I have not run this script on my machine ... I would recommend running only the find command first and verifying if the list is what you want
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.