Script to delete files older than x days and also taking an input for multiple paths


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Script to delete files older than x days and also taking an input for multiple paths
# 1  
Old 10-05-2012
Script to delete files older than x days and also taking an input for multiple paths

Hi ,

I am a newbie!!!

I want to develop a script for deleting files older than x days from multiple paths. Now I could reach upto this piece of code which deletes files older than x days from a particular path. How do I enhance it to have an input from a .txt file or a .dat file? For eg: For deleting *.csv files older than Num_days, I am using below piece of code:


Code:
 
cd $FILEPATH
find ./ -type d ! -name . -prune -o -mtime +$Num_days -name "*.csv" -exec rm {} \;


I am using # ! /bin/sh
# 2  
Old 10-05-2012
You could read the paths from the file using a while loop. Then call find once per path, substituting the value read into the find command twice, as the path argument and the argument to the first -name predicate.

Regards and welcome to the forum,
Alister
This User Gave Thanks to alister For This Post:
# 3  
Old 10-05-2012
There are several ways to do this. Assuming there are no whitespace characters in any of the directory names in the list of directories in your text file, the following is probably the shortest:
Code:
find $(cat dirlist.txt) -type d ! -name . -prune -o -mtime +$Num_days -name "*.csv" -exec rm {} \;

If there might be space or tab characters in directory names:
Code:
saveIFS="$IFS"
IFS=""
while read dir
do find "$dir" -type d ! -name . -prune -o -mtime +$Num_days -name "*.csv" -exec rm {} \;
done < dirlist.txt
IFS="$saveIFS"

If there are any newline characters in the directory names in your list, you have my sympathy and will not be able to use anything that has a newline separated list of directories (i.e., a text file) to store the directory list.

Last edited by Don Cragun; 10-05-2012 at 12:50 PM.. Reason: fix typo
This User Gave Thanks to Don Cragun For This Post:
# 4  
Old 10-05-2012
Quote:
Originally Posted by Don Cragun
Code:
saveIFS="$IFS"
IFS=""
while read dir

Don, is there a reason to not simply override IFS in read's environment? Also, I may be overly paranoid, but I use -r to defend against backslashes.
Code:
while IFS= read -r dir ...

Regards,
Alister

---------- Post updated at 12:29 PM ---------- Previous update was at 12:05 PM ----------

Quote:
Originally Posted by Don Cragun
Code:
find $(cat dirlist.txt) -type d ! -name . -prune -o -mtime +$Num_days -name "*.csv" -exec rm {} \;

Code:
saveIFS="$IFS"
IFS=""
while read dir
do find "$dir" -type d ! -name . -prune -o -mtime +$Num_days -name '*.csv' -exec rm {} \;
done < dirlist.txt
IFS="$saveIFS"

Because of -name . -prune not matching the current path, neither of those will work correctly.

A cd fixes the second suggestion:
Code:
while IFS= read -r d; do
(
    cd "$d" &&
    find . -type d ! -name . -prune -o -mtime +$Num_days -name '*.csv' -exec rm {} \;
)
done < dirlist.txt

If the paths are absolute, the subshell isn't needed.

An unwieldy solution that doesn't cd:
Code:
while IFS= read -r d; do
    find "$d" -type d \( -name "${d##*/}" -exec test "$d" = {} \; -o -prune \) -o -mtime +$Num_days -name '*.csv' -exec rm {} \;
done < dirlist.txt

For find implementations which support a -maxdepth primary (GNU, *BSD, etc) which simplifies restricting the traversal:
Code:
while IFS= read -r d; do
    find "$d" -maxdepth 1 -mtime +$Num_days -name '*.csv' -exec rm {} \;
done < dirlist.txt

Regards,
Alister

Last edited by alister; 10-05-2012 at 01:50 PM..
These 2 Users Gave Thanks to alister For This Post:
# 5  
Old 10-05-2012
Quote:
Originally Posted by alister
Don, is there a reason to not simply override IFS in read's environment? Also, I may be overly paranoid, but I use -r to defend against backslashes.
Code:
while IFS= read -r dir ...

Regards,
Alister

---------- Post updated at 12:29 PM ---------- Previous update was at 12:05 PM ----------



Because of -name . -prune not matching the current path, neither of these will work correctly.

I suggest (untested):
Code:
while IFS= read -r d; do
    find "$d" -type d \( -name "${d##*/}" -exec test "$d" = {} \; -o -prune \) -o -mtime +$Num_days -name '*.csv' -exec rm {} \;
done < dirlist.txt

Some find implementations (GNU, *BSD) support a -maxdepth primary which makes it simpler to restrict traversal to a max level:
Code:
while IFS= read -r d; do
    find "$d" -maxdepth 1 -mtime +$Num_days -name '*.csv' -exec rm {} \;
done < dirlist.txt

Regards,
Alister
Using read's -r option is a good idea for this application, and just setting IFS for the read is also fine.

Depending on what I'm doing, I frequently just set IFS="" at the start of a script knowing that it won't affect the invoking shell execution environment. I saved and restored it here in case someone runs this code without putting it in a subshell environment; but just setting it for read has the same effect.
# 6  
Old 10-05-2012
I was refining my recommendations when you posted your reply. Apologies for the mismatched post/quote.

Regards,
Alister
This User Gave Thanks to alister For This Post:
# 7  
Old 10-08-2012
Thank you both Alister and Don, but somehow I could not understand this line

Code:
while IFS= read -r d;

What is read -r helping us with?
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Find files not matching multiple patterns and then delete anything older than 10 days

Hi, I have multiple files in my log folder. e.g: a_m1.log b_1.log c_1.log d_1.log b_2.log c_2.log d_2.log e_m1.log a_m2.log e_m2.log I need to keep latest 10 instances of each file. I can write multiple find commands but looking if it is possible in one line. m file are monthly... (4 Replies)
Discussion started by: wahi80
4 Replies

2. Shell Programming and Scripting

Script to delete files in a folder older than 2 days

hi i need a script to delete the files older than 2 days... if my input is say in a folder versions A_14122012.txt A_15122012.txt A_16122012.txt A_17122012.txt i want my output to be A_16122012.txt A_17122012.txt thanks in advance hemanth saikumar. (2 Replies)
Discussion started by: hemanthsaikumar
2 Replies

3. Shell Programming and Scripting

Delete files older than X days.

Hi All, I am using below code to delete files older than 2 days. In case if there are no files, I should log an error saying no files to delete. Please let me know, How I can achive this. find /path/*.xml -mtime +2 Thanks and Regards Nagaraja. (3 Replies)
Discussion started by: Nagaraja Akkiva
3 Replies

4. Solaris

Delete files older than 30 days

Hi all, I want to delete log files with extension .log which are older than 30 days. How to delete those files? Operating system -- Sun solaris 10 Your input is highly appreciated. Thanks in advance. Regards, Williams (2 Replies)
Discussion started by: William1482
2 Replies

5. Shell Programming and Scripting

Delete files older than 2 days using shell script in Unix

I'm new to shell script.... can any one help... What is the shell script to delete the files older than 2 days ? (3 Replies)
Discussion started by: satishpabba
3 Replies

6. Shell Programming and Scripting

delete files more than 15 days older

i have to delete files which are older than 15 days or more except the ones in the directory Current and also *.sh files i have found the command for files 15 days or more older find . -type f -mtime +15 -exec ls -ltr {} \; but how to implement the logic to avoid directory Current and also... (3 Replies)
Discussion started by: ali560045
3 Replies

7. UNIX for Dummies Questions & Answers

Delete files older than 30 days

This is driving me crazy. How can I delete files in a specifc directory that are over 30 days old? Thanks in advance. (3 Replies)
Discussion started by: tlphillips
3 Replies

8. UNIX for Dummies Questions & Answers

How can I delete files older than 7 days?

I will like to write a script that delete all files that are older than 7 days in a directory and it's subdirectories. Can any one help me out witht the magic command or script? Thanks in advance, Odogboly98:confused: (3 Replies)
Discussion started by: odogbolu98
3 Replies

9. UNIX for Dummies Questions & Answers

delete files older than 7 days

can anyone tell me how I would write a script in ksh on AIX that will delete files in a directory older than 7 days? (1 Reply)
Discussion started by: lesstjm
1 Replies
Login or Register to Ask a Question