How to cd in shell scripting?

Hi guys,

Can anyone help me please, I have a code which will retain number of files maximum of 3 and will remove the one on top (using head -1 command). See code below:

#!/usr/bin/sh

num_of_files=`ls /home/user/USER_LOGS/ | grep UserActivity | grep UMB00 | wc -l`

if [ $num_of_files -gt 3 ]
then
remove=`ls -lrt /home/user/USER_LOGS/ | grep UserActivity | grep UMB00 | head -1 | awk '{print $8}' | rm \`xargs\``
$remove
fi

The code is located on the same directory /home/nsadm/USER_LOGS/. It functions well trying to give the output that I want, however when I already went out of the sub-directory USER_LOGS hitting the command cd which by default will bring me to /home/nsadm/, then I tried to run the script as /home/nsadm/USER_LOGS/remover.sh, the script didn't work.

I hope anyone can suggest what to do because I'm planning to place this script in CRON. By the way, I've also tried to run the script as root user because only root user can deploy entries in CRON, so as per login default directory is /root (for root user), then I ran the script /home/nsadm/USER_LOGS/remover.sh, again it didn't work.

Here's the error that I've got:

rm: cannot remove `UMB00_UserActivity_20120103_094606.log': No such file or directory

Regards,
rymnd_12345

If you are just removing the top 1 file, then use this,

 
#!/usr/bin/sh
num_of_files=`ls /home/user/USER_LOGS/ | grep UserActivity | grep UMB00 | wc -l`

if [ $num_of_files -gt 3 ]
then
remove=`ls -lrt /home/user/USER_LOGS/ | grep UserActivity | grep UMB00 | head -1 | awk '{print $8}'`
rm $remove
fi

alternate approach to remove first file ..

$ ls -1tr /home/user/USER_LOGS/*UserActivity* | nawk '/UMB00/{if(NR==1){print "rm "$0}}' | sh

Hi Rksiva,

I've tried your suggestion but running like /home/nsadm/USER_LOGS/remover.sh won't remove the file, I've checked and verified that the files are still 4 and that the first file which is supposed to be deleted was not removed. Please see below:

nssh# /home/nsadm/USER_LOGS/remover.sh
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory

Hi jayan_jay,

I've also tried below but it's not working. Thanks..

Guys,
Maybe you can suggest another script either perl/shell which will serve as watcher to maintain only 3 files within the directory and it will be placed in the CRON so that everyday whenever a new file will be created, the 3-day old log will be removed. I appreciate even if I will not use my script, and will you use the one that you'll suggest.

br,
rymnd_12345

Untested.

And, place this script in a different directory, because when number of files are counted using wc -l , the file containing below script too will be counted, right?

#!/usr/bin/sh
num_of_files=`ls /home/user/USER_LOGS/ | grep UserActivity | grep UMB00 | wc -l`
while [ $num_of_files -gt 3 ]
do
    rm -rf `ls -lrt /home/user/USER_LOGS/ | grep UserActivity | grep UMB00 | head -1 | awk '{print $8}'`
    num_of_files=`ls /home/user/USER_LOGS/ | grep UserActivity | grep UMB00 | wc -l`
done

Hi balajesuri,

I've tried what you've suggested but still it's not functioning :frowning:
Please see below:

nssh# /home/user/remover.sh
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
rm: cannot remove `UMB00_UserActivity_20120103_094701.log': No such file or directory
..................................................................................................................
..................................................................................................................

Note that this is already under the directory /home/user/ and not /home/user/USER_LOGS/ anymore.

BTW, Can you suggest a watcher script that will perform same function? or maybe deleting/removing files that are already 3-day old? Let's say I have particular directory handling all the files (e.g /home/nsadm/USER_LOGS/), then the script will watch this directory and limit the files for today, yesterday and the other day (3 files).

Please advise,
rymnd_12345

If you want to remove already 3 days old file, then complete the task with find command itself ..

$ find /home/nsadm/USER_LOGS -name "UMB00_UserActivity*" -type f -mtime +3 -exec rm {} \;

Better if u want to remove all the files older than 3 days, then u can very well go ahead and use the find command as below,

 find /home/user/USER_LOGS -ctime +3 -exec rm {}\; 

Hi jayan_jay/Guys,

See my files below:

-rw-r--r-- 1 nsadm nsadms 141732 2012-01-02 09:53 UMB00_UserActivity_20120102_095300.log
-rw-r--r-- 1 nsadm nsadms 144066 2012-01-03 09:53 UMB00_UserActivity_20120103_095300.log
-rw-r--r-- 1 nsadm nsadms 144066 2012-01-04 09:53 UMB00_UserActivity_20120104_095300.log

So tomorrow another file will be created again and will be added on this directory, example additional file will be:

-rw-r--r-- 1 nsadm nsadms 144066 2012-01-05 09:53 UMB00_UserActivity_20120105_095300.log

I want that after the new file will be added, the remover script will remove the file on top which is:

-rw-r--r-- 1 nsadm nsadms 141732 2012-01-02 09:53 UMB00_UserActivity_20120102_095300.log

I hope I explained it well. Thanks!

Br,
rymnd_12345

Did u try the above find command, it will also do the samething u have explained.

Hi Rksiva,

I didn't yet tried the above command because I'm confuse of how to put that in my script? Will I include it the this script, on what part? Please advise.

Br,
rymnd_12345

In cron itself u can directly include the command or else u can include in script anywhere.

To answer the question in post #1 .

Insert line 2 of your script:

cd /home/nsadm/USER_LOGS/

That should fix the problem with trying to remove a file with no pathname.

Hi Rksiva, methyl, All,

Thanks for all your help, I already got the output that I want. Appreciate all your effort guys, God bless.

Best regards,
rymnd_12345