Question

Cron installation is vixie-cron

/etc/cron.daily/rmspam.cron

#!/bin/bash
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*;

I Have this simple bash script that I want to add to a cron job (also includes spam learning commands before) but this part always fails with "File or directory not found" From what I figure is the metachar isn't being interperted correctly when run as a cron job. If I execute the script from the commandline it works fine.

I'd like a why for this not working and of course a working solution :)

Thanks

edit #1 came back to this question when I got popular question badge for it. I first did this,

#!/bin/bash
find  /home/user/Maildir/.SPAM/cur/ -t file | xargs rm

and just recently was reading through the xargs man page and changed it to this

#!/bin/bash
find  /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm

short xargs option is -r

Was it helpful?

Solution

If there are no files in the directory, then the wildcard will not be expanded and will be passed to the command directly. There is no file called "*", and then the command fails with "File or directory not found." Try this instead:

if [ -f /home/user/Maildir/.SPAM/cur/* ]; then
    rm /home/user/Maildir/.SPAM/cur/*
fi

Or just use the "-f" flag to rm. The other problem with this command is what happens when there is too much spam for the maximum length of the command line. Something like this is probably better overall:

find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' +

If you have an old find that only execs rm one file at a time:

find /home/user/Maildir/.SPAM/cur -type f | xargs rm

That handles too many files as well as no files. Thanks to Charles Duffy for pointing out the + option to -exec in find.

OTHER TIPS

Are you specifying the full path to the script in the cronjob?

00 3 * * * /home/me/myscript.sh

rather than

00 3 * * * myscript.sh

On another note, it's /bin/rm on all of the linux boxes I have access to. Have you double-checked that it really is /usr/bin/rm on your machine?

try adding

MAILTO=your@email.address

to the top of your cron file and you should get any input/errors mailed to you.

Also consider adding the command as a cronjob

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*

Try using a force option and forget about adding a path to rm command. I think it should not be needed...

rm -f

This will ensure that even if there are no files in the directory, rm command will not fail. If this is a part of a shell script, the * should work. It looks to me that you might have an empty dir...

I understand that the rest of the script is being executed, right?

Is rm really located in /usr/bin/ on your system? I have always thought that rm should reside in /bin/.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top