如何让我的系统在保持目录结构不变的情况下删除某个目录中超过某个时间的所有文件?

12 scripts delete automation files directory

我的机器上有一个目录,将其视为我自己的tmp目录,但它在我的~目录中。我想让我的系统每 3 小时删除一次该目录中的所有文件(尽管保持任何目录结构不变,但仍然递归地删除所有目录级别中的所有文件)该目录中超过一天的文件。

我正在运行带有 GNOME 3.18 的 Ubuntu GNOME 15.10,可以这样做吗?如果是这样,如何?我希望这是完全自动化的,不需要用户交互。这应该是我登录时自动启动的东西,所以我不需要在每次启动时都运行一些东西。

hee*_*ayl 21

使用find

find ~/tmp -type f -mtime +0 -delete
Run Code Online (Sandbox Code Playgroud)
  • ~/tmp 是要递归搜索的目录,相应地更改它

  • -type f 将只查找文件

  • -mtime +0 如果文件最后一次修改是在一天或更长时间之前,它将匹配一个文件

  • -delete 只会删除匹配的文件

这里的问题是-mtime +0,大多数人可能会想到使用-mtime +1find在计算天数时会忽略任何小数时间。因此,-mtime +1如果上次修改至少在 2 天前进行,则将匹配文件。

引用man find-mtime具有与以下相同的时间约定-atime

-atime n

文件最后一次访问是在 n*24 小时前。当 find 计算出该文件在多少 24 小时前被上次访问时,任何小数部分都将被忽略,因此要匹配 -atime +1,文件必须至少在两天前被访问过。

另请注意,如果您想要精确度,您应该查看以分钟为单位指示时间的-mmin选项find

要在 3 小时后定期运行它,您可以添加一个cron条目。

运行crontab -e并添加:

00 */3 * * * /usr/bin/find ~/tmp -type f -mtime +0 -delete
Run Code Online (Sandbox Code Playgroud)

使用zsh删除文件:

rm ~/tmp/**/*(.-m+0)
Run Code Online (Sandbox Code Playgroud)

添加到cron

00 */3 * * * /usr/bin/zsh -c 'rm ~/tmp/**/*(.-m+0)'
Run Code Online (Sandbox Code Playgroud)


小智 6

您应该能够删除所有早于 1 天的文件/home/username/directory及其下面的所有目录:

find /home/username/directory -type f -mtime +1 -delete
Run Code Online (Sandbox Code Playgroud)

并每三个小时安排该命令将其设置为 cron 作业:

crontab -e
Run Code Online (Sandbox Code Playgroud)

然后在 crontab 里面:

0 */3 * * * find /home/username/directory -type f -mtime +1 -delete
Run Code Online (Sandbox Code Playgroud)

它在每小时(即分钟 0)每三个小时运行一次您的命令,所以 3:00 am、6:00 am 等。

croncrontab manpages了解更多关于它们的信息。

  • @ParanoidPanda 我知道您想要高质量的答案,但是基本上不需要两次评论相同的事情,并且可能会被视为咄咄逼人,尤其是对于新用户。 (5认同)
  • 这个答案实际上是错误的,请参阅[另一个答案](https://askubuntu.com/a/709890/364819)。 (4认同)
  • 由于这个答案是**错误的**,并且实际上并没有比其他答案多说什么,请改进您的答案,使其比其他答案*正确*和*更好*,或者将其删除。 (4认同)
  • @RPiAwesomeness:嗯,我第二次评论是因为我没有时间编辑我的第一条评论,我还想说他们应该删除他们的答案,虽然我的第一条评论不一定能理解这些答案不想让他们感到受到攻击,就像我只是说他们给出了错误的答案,现在必须删除它,所以我添加了一些关于改进的内容。但是我可以看出这是如何被错误地采取的,所以我请你记住:当你拿走他的竹子时,熊猫只会变得咄咄逼人。**;-)** (2认同)