在遇到垃圾邮件问题后,我停止了postfix
postfix stop
并通过手动检查mailq
发现了数十万条未发送的垃圾邮件。
垃圾邮件是从本地托管的网站之一发送的,我知道自从我停止外发邮件以来,该用户没有尝试发送任何电子邮件。
因此,来自我计算机上该用户的所有消息/var/spool/postfix/maildrop
都被认为是垃圾邮件,我想将它们删除或移动到另一个目录以供以后调查。
我想移动给定所有者的所有文件(在本例中为用户“web2”)从
/var/spool/postfix/maildrop
到
/var/spool/postfix/temp-spam
我怎样才能做到这一点?
答案1
您可以使用find
和xargs
,例如:
find /var/spool/postfix/maildrop -user web2 -print0 -type f | xargs -0 -I{} mv {} /var/spool/postfix/temp-spam
您可以通过插入来测试它echo
:
find /var/spool/postfix/maildrop -user web2 -print0 -type f | xargs -0 -I{} echo mv {} /var/spool/postfix/temp-spam
答案2
您也可以在不生成xargs
using 的find
情况下完成此操作-exec
。
find /var/spool/postfix/maildrop -user THEUSER -type f -exec mv {} /var/spool/postfix/temp-spam \;
如果您想查看正在移动的文件,可以-exec
在命令中添加附加内容:
find /var/spool/postfix/maildrop -user THEUSER -type f -exec ls -lah {} \; -exec mv {} /var/spool/postfix/temp-spam \;
答案3
标准命令find
让您可以根据元数据(名称、权限等)匹配文件并对其进行操作。它递归地遍历目录。基本语法find
后跟要遍历的目录,然后是匹配条件,还可以选择后跟要执行的命令(如果不指定命令,find
则打印匹配的名称)。
find /var/spool/postfix/maildrop -user web2 -exec mv -t /var/spool/postfix/temp-spam {} +
mv -t /var/spool/postfix/temp-spam …
这将执行匹配文件的命令:{}
被所有匹配文件的列表替换(如果列表太长,find
将执行mv
多次)。
选项-t
是mv
GNU (Linux/Cygwin) 扩展。在没有它的系统上,您需要先传递要移动的文件名,然后传递目标。该-exec … +
操作仅允许在命令行末尾传递文件名,因此您需要诉诸其他方法。
find /var/spool/postfix/maildrop -user web2 -exec mv {} /var/spool/postfix/temp-spam \;
(mv
每个文件单独调用)
find /var/spool/postfix/maildrop -user web2 -exec sh -c 'mv "$@" "$0"' /var/spool/postfix/temp-spam {} +
(使用中间 shell 按所需顺序获取参数)
如果您使用 zsh,则可以使用它的全局限定符执行与 相同的工作find
。此处,u
用于匹配用户拥有的文件的标志。
mv /var/spool/postfix/maildrop/*(u:web2:) /var/spool/postfix/temp-spam
(与find
上面的命令不同,这不会递归到子目录。这里不需要它,但如果您需要它,请**/
在路径中插入“零个或多个子目录”,例如/var/spool/postfix/maildrop/**/*(u:web2:)
。)