Sign up ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

I've create a bash script to scan whole server for virus via clamav. The script has been running via cron every night. Because of this I want to scan only the files that has been added last 24 hours. For now I am using this command in my script:

find /home -type f -mmin -1440  -print0 | xargs -0 -r clamscan --infected

But it's too slow, is the find command the reason of being slow? If so what is the better way to scan only last 24 hours files with clamscan? Does clamav have any option to doing this?

Any Help would be much appreciated.

share|improve this question
Is it find that's being slow or clamav? How long does the command take without the xargs/clam pipe? And what does "too slow" means anyway? –  Sven Feb 18 '13 at 12:50
The find command without the xargs/clam take about 10 minutes and the whole command take about 2 hours on my server. I think maybe if clamav has an option for my purpose, it would be faster than this. –  Ehsan Feb 18 '13 at 13:11

2 Answers 2

I stumbled onto this page, when I was looking for a clamscan script. I followed above advice and got it working with:

# Create Hourly Cron Job With Clamscan

# Directories to scan

# Temporary file
list_file=$(mktemp -t clamscan.XXXXXX) || exit 1

# Location of log file

# Make list of new files
if [ -f  "$log_file" ]
        # use newer files then logfile
        find "$scan_dir" -type f -cnewer "$log_file" -fprint "$list_file"
        # scan last 60 minutes
        find "$scan_dir" -type f -cmin -60 -fprint "$list_file"

if [ -s "$list_file" ]
        # Scan files and remove (--remove) infected
        clamscan -i -f "$list_file" --remove=yes > "$log_file"

        # If there were infected files detected, send email alert
        if [ `cat $log_file | grep Infected | grep -v 0 | wc -l` != 0 ]
                echo "$(egrep "FOUND" $log_file)" | mail -s "VIRUS PROBLEM on $HOSTNAME" -r     clam@nas.local
        # remove the empty file, contains no info
        rm -f "$list_file"

It was an hourly script in my case, but should work for daily (modify the second find).

share|improve this answer

Depending on how many files are actually affected, I don't think that 2 hours is that long for a virus scan. Anyway, you could try to improve the speed the following way:

Output the find result into a file instead of piping it into xargs and then use clamscan with with the --file-list=FILE option. This would possibly improve the run time because clamav would only need to start and initialize once` instead of multiple times. Please leave a comment and tell me how much this sped things up if at all.

Another option (or an additional one) would be to limit your scan to certain vulnerable file types, but personally, I don't like this approach.

share|improve this answer
Thank you @SvenW for your answer. I will test this and let you know the result. –  Ehsan Feb 19 '13 at 12:17

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.