Linux服务器下如何用Python实现主目录病毒扫描完成后终止扫描循环
解决主目录扫描后终止递归的问题
看起来你是因为os.walk默认递归遍历所有子目录层级,导致每次进入子文件夹都会触发扫描,进而收到大量通知邮件。其实只要调整遍历逻辑,只处理主目录(也就是path下的直接内容)就能解决这个问题,给你两个简单的方案:
方案一:直接扫描主目录(推荐,逻辑更清晰)
放弃使用os.walk,直接用os.scandir扫描目标主目录下的所有条目(文件和子目录),这样就不会递归到更深的层级。同时注意如果不需要扫描子目录内部的文件,记得去掉clamscan的-r参数(不然clamscan自己还是会递归扫子目录内容)。示例代码调整如下:
import os import time import subprocess path = "/你的目标路径" # 直接扫描主目录下的所有条目 with os.scandir(path) as listOfEntries: for entry in listOfEntries: # 检查条目修改时间是否超过60秒 age = time.time() - entry.stat().st_mtime if age > 60: scan_target = entry.path # 如果你不想扫描子目录内部的文件,就去掉-r参数;如果需要扫子目录但只扫一层,用--max-recursion=1 value = subprocess.run(['clamscan', scan_target], capture_output=True, text=True) # 解析扫描结果 for line in value.stdout.split("\n"): if 'Infected' in line: parts = line.split(":") if len(parts) >= 2: infected_count = parts[1].strip() if infected_count == "0": # 这里添加你的移动逻辑,比如用shutil.move if entry.is_dir(): print(f"移动无感染目录:{entry.path}") else: print(f"移动无感染文件:{entry.path}")
方案二:用os.walk但只处理第一次循环
os.walk的第一个迭代返回的就是主目录的信息,之后的迭代才会进入子目录。所以我们可以在处理完第一次循环后直接break,终止递归遍历:
import os import time import subprocess path = "/你的目标路径" # 只处理os.walk的第一次迭代(主目录) for dirs, subdirs, files in os.walk(path): # 处理主目录下的文件 for file in files: file_path = os.path.join(dirs, file) age = time.time() - os.stat(file_path).st_mtime if age > 60: value = subprocess.run(['clamscan', file_path], capture_output=True, text=True) for line in value.stdout.split("\n"): if 'Infected' in line and len(line.split(":"))>=2 and line.split(":")[1].strip() == "0": print(f"移动无感染文件:{file_path}") # 处理主目录下的子目录 for subdir in subdirs: subdir_path = os.path.join(dirs, subdir) age = time.time() - os.stat(subdir_path).st_mtime if age > 60: # 同样,按需决定是否保留-r参数 value = subprocess.run(['clamscan', subdir_path], capture_output=True, text=True) for line in value.stdout.split("\n"): if 'Infected' in line and len(line.split(":"))>=2 and line.split(":")[1].strip() == "0": print(f"移动无感染目录:{subdir_path}") # 终止os.walk的递归遍历 break
关键提示
- 原代码里嵌套了
os.walk和os.scandir,这会导致重复处理目录结构,尽量避免这种冗余逻辑; - 如果你只是想确认主目录下的条目本身安全,不需要深入子目录,一定要去掉
clamscan的-r参数,否则clamscan还是会自行递归扫描子目录内的所有文件,依旧会产生大量通知。
内容的提问来源于stack exchange,提问作者madhan
相关产品推荐
相关产品推荐

