自动删除7天以上的文件


17

我在linux上是个菜鸟,但是我开始理解它了。我有一个运行FTP服务器的Ubuntu Server 16.04,用于备份安全视频文件。该文件将被存储在文件夹一样:/home/securityfolder1/home/securityfolder2/home/securityfolder3等。

请注意,每个securityfolderN用户都是不同的用户。

因为我不希望硬盘一直充满,所以我想每天删除这些文件夹中7天以上的文件。


/home通常为每个用户包含一个子文件夹。如果您不想将备份存储为其他用户(不是一个好主意),则应考虑其他位置,例如/home/security/backup1以此类推。
Melebius

@Melebius感谢您的评论,每个/ securityfolder都是不同的用户,我忘了提了。
Jacco van de Wijgaart,2016年

Answers:


27

首先,此命令将在/home名称以以下字母开头的任何子目录中查找并删除所有7天以上的文件securityuser

find /home/securityuser* -mtime +6 -type f -delete

您不需要-mtime +6+7因为-mtime计数24小时。正如解释-atime的部分man find-mtime以相同的方式工作):

   -atime n
          File  was  last  accessed n*24 hours ago.  When find figures out
          how many 24-hour periods ago the file  was  last  accessed,  any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

因此,要查找7天或更早之前被修改的文件,您需要查找6天或更早之前被修改的文件-mtime +6

下一步是每天运行一次此命令。由于每个securityuserN用户都是不同的用户(您可能需要重新考虑该设置,这会使一切变得更加复杂),因此必须以root用户身份运行。因此,编辑/etc/crontab

sudo nano /etc/crontab

并添加以下行:

@daily root find /home/securityuser* -mtime +6 -type f -delete

这将find每天运行一次命令并删除文件。


+1深入探讨,也许重申Melebius对OP的建议,即find '/home/securityuser/*' -mtime +6 -type f -delete(在用户创建过程中进行所有相关且适当的更改)通常比find '/home/securityuser*' -mtime +6 -type f -delete(不走斜线)更好的主意 ...?
Cbhihe

@Cbhihe不,目标目录称为/home/securityuserN,因此如果没有斜杠,将不会找到它们。
terdon

是的,看到了;只是不认为按照Melebius的第一条评论,OP方面的良好做法(为每个安全视频创建一个单独的用户等),即使OP可能有这样做的理由。如果有什么话,我的评论是la脚的,不是对您的良好和完整答案的批评。
Cbhihe

1
从我+1。只需在我在RHEL上运行时注意一个细节即可:通配符在路径上不起作用。我必须把它放在-namefind /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis

1
@SteliosAdamantidis哇,我完全错过了!是的,自从我引用以来,原始版本就无法使用'securityuser*'。通配符应该由shell而不是扩展find,因此它应该已经securityuser*(没有引号)。查看最新答案。感谢您指出这一点,Stelio,我不敢相信之前没有人注意到!Ti vlakas!
terdon

4

据我所知:

试试这样的find命令:

find ./dirc/* -mtime +6 -type f -delete

./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm

谢谢您的回答。./dirc/*表示:./ home / securityfolder1 / *还是这样?
Jacco van de Wijgaart,2016年

我只是在我的virtualbox中尝试了一下find /home/jacco/ -mtime +1 -type f -delete,它似乎起作用了。我该如何自动化呢?
Jacco van de Wijgaart,2016年

制作一个脚本文件,并在可行时使用脚本触发此命令,而不是在启动过程中运行脚本文件。
莫利克·帕特尔

我就像这里的超级用户,因为是制作脚本的一部分,这是否意味着文件#!/bin/bash及其下的代码?还是我真的很愚蠢?
Jacco van de Wijgaart,2016年

2
@Melebius不,不应该引用路径,特别是在包含glob字符时。您希望它被外壳扩展,而引用会阻止它。尝试,例如:find '/u*' -name local-name "foo*"包含全局字符时,应引用此类指令。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.