删除在 Linux 上一段时间内未被访问的文件

我们已经介绍了怎样手动 在 Linux 中使用“find”命令查找和删除超过 X 天的文件. 今天我们将做同样的事情,但前提是文件在一段时间内未被访问。 打招呼 “Tmpwatch”,一个命令行实用程序,用于递归删除在给定时间内未访问的文件。 不仅仅是文件,tmpwatch 也会删除空目录。

默认情况下,Tmpwatch 将根据其决定删除哪些文件/目录 atime (访问时间)。 当然,您可以通过使用更改此行为 ctime (inode 更改时间), mtime (修改时间)值。 正常情况下,Tmpwatch 可以用来删除 /tmp 目录和其他未使用和不需要的东西,如旧日志文件。

一个重要的警告!!

在开始使用这个工具之前,你必须知道 Tmpwatch 会根据给定的条件递归删除文件和目录。 不要在 /(根目录)中运行 tmpwatch. 该目录包含保持 Linux 系统运行所需的重要文件。 如果不够小心,tmpwatch 会删除整个根目录中符合给定条件的重要系统文件和目录。 Tmpwatch 工具没有内置保护机制来防止您在根目录下运行它。 因此,无法撤消该操作。 你被警告了!

内容

  1. 在 Linux 上安装 Tmpwatch
  2. 使用 Tmpwatch / Tmpreaper 删除在给定时间内未访问的文件
    1. 删除超过 X 天未访问的文件
    2. 删除超过 X 天未修改的文件
    3. 删除符号链接
    4. 删除所有文件
    5. 从删除中排除目录
    6. 执行测试运行而不实际删除任何内容
    7. 强制删除文件
    8. 跳过删除某些文件
    9. 设置 cron 作业以定期删除文件

在 Linux 上安装 Tmpwatch

大多数 Linux 发行版的默认存储库中都提供了 Tmpwatch。

在 Fedora、CentOS、RHEL、AlmaLinux 和 Rocky Linux,您可以使用以下命令进行安装:

$ sudo dnf install tmpwatch

在 openSUSE 上:

$ sudo zypper install tmpwatch

在 Debian 及其衍生产品(如 Ubuntu)上,Tmpwatch 有不同的名称,即 盗贼. Tmpreaper 主要基于`tmpwatch-1.2/1.4′ 埃里克·特罗恩 来自红帽。 现在, tmpreaper 由 Debian 维护 保罗·斯洛特曼.

要在 Debian、Ubuntu、Linux Mint 上安装 tmpreaper,请运行:

$ sudo apt install tmpreaper

要启动它,请运行:

$ tmpreaper <options>

或输入完整路径:

$ /usr/sbin/tmpreaper <options>

使用 Tmpwatch / Tmpreaper 删除在给定时间内未访问的文件

Tmpwatch 和 Tmpreaper 的用法几乎相同。 如果您使用的是基于 Debian 的系统,请在以下示例中将“Tmpwatch”替换为“Tmpreaper”。

删除超过 X 天未访问的文件

要删除超过 10 天的文件,请运行:

tmpwatch 10d /var/log/

上述命令将删除所有超过 10 天未访问的文件和空目录 /var/log/ 文件夹。

删除超过 X 天未修改的文件

就像我已经说过的,Tmpwatch 会根据文件的访问时间删除文件。 您还可以使用基于修改时间 (mtime) 的文件删除文件 -m 选项。

为了 example, 以下命令将删除 10 天内未修改的文件 /var/log/ 文件夹。

tmpwatch -m 10d /var/log/

这里, -m 指的是修改时间和 d 是个 <时间规格> 范围。 参数定义删除文件的年龄阈值。 您可以使用以下 time_spec 参数来删除文件。

  • d – 持续数天,
  • h – 用了几个小时,
  • m – 几分钟,
  • s – 几秒钟。

小时 是默认值。

例如,删除过去未修改的文件 10个小时,只需运行:

tmpwatch -m 10 /var/log/

您可能已经注意到,我没有在上述命令中使用 time_spec 参数。 因为, H (for hours) 是默认参数,因此我们在删除过去 X 小时内未修改的文件时不必提及它。

如果要删除符号链接,而不仅仅是常规文件和目录,请使用 -s 选项如下。

tmpwatch -s 10 /var/log/

删除所有文件

要删除所有文件类型,而不仅仅是常规文件、符号链接和目录,请使用 -a 选项。

tmpwatch -a 10 /var/log/

上述命令将删除所有类型的文件,包括常规文件、符号链接和目录中的 /var/log/ 文件夹。

从删除中排除目录

有时,您可能想要删除文件,而不是目录。 如果是这样,命令将是:

tmpwatch -am 10 --nodirs /var/log/

上述命令将删除除过去 10 小时内未修改的目录之外的所有文件。

执行测试运行而不实际删除任何内容

有时,您可能想要查看实际要删除的文件。 在重要目录上运行 Tmpwatch 时,这将很有帮助。 如果是这样,请在测试模式下运行 Tmpwatch -t 选项。

tmpwatch -t 30 /var/log/

CentOS 7 服务器的示例输出:

removing file /var/log/wtmp
removing directory /var/log/ppp if empty
removing directory /var/log/tuned if empty
removing directory /var/log/anaconda if empty
removing file /var/log/dmesg.old
removing file /var/log/boot.log
removing file /var/log/dnf.librepo.log

在基于 Debian 的系统上,您将看到如下输出。

$ tmpreaper -t 30 /var/log/
(PID 1803) Pretending to clean up directory `/var/log/'.
(PID 1804) Pretending to clean up directory `apache2'.
Pretending to remove file `apache2/error.log'.
Pretending to remove file `apache2/access.log'.
Pretending to remove file `apache2/other_vhosts_access.log'.
(PID 1804) Back from recursing down `apache2'.
(PID 1804) Pretending to clean up directory `dbconfig-common'.
Pretending to remove file `dbconfig-common/dbc.log'.
(PID 1804) Back from recursing down `dbconfig-common'.
(PID 1804) Pretending to clean up directory `dist-upgrade'.
(PID 1804) Back from recursing down `dist-upgrade'.
(PID 1804) Pretending to clean up directory `lxd'.
(PID 1804) Back from recursing down `lxd'.
Pretending to remove file `/var/log//cloud-init.log'.
(PID 1804) Pretending to clean up directory `landscape'.
Pretending to remove file `landscape/sysinfo.log'.
(PID 1804) Back from recursing down `landscape'.
[...]

这只会模拟操作,但实际上不会删除任何内容。 Tmpwatch 将简单地执行试运行并显示将在输出中删除哪些文件。

强制删除文件

如果要强行删除文件,请使用 -f 选项。

tmpwatch -f 10h /var/log/

通常,当前用户拥有的没有写访问权限的文件不会被删除。 这 -f 选项也会删除它们。

跳过删除某些文件

Tmpreaper 有一个选项可以跳过删除的文件。 当您想要保留某些类型的文件并删除其他所有文件时,这将非常有用。 如果是这样,请使用 --protect 选项。

tmpreaper --protect '*.txt' -t 10h /var/log/

此命令将跳过所有具有 .txt 从删除扩展

示例输出:

(PID 2623) Pretending to clean up directory `/var/log/'.
(PID 2624) Pretending to clean up directory `apache2'.
Pretending to remove file `apache2/error.log'.
Pretending to remove file `apache2/access.log'.
Pretending to remove file `apache2/other_vhosts_access.log'.
(PID 2624) Back from recursing down `apache2'.
(PID 2624) Pretending to clean up directory `dbconfig-common'.
Pretending to remove file `dbconfig-common/dbc.log'.
(PID 2624) Back from recursing down `dbconfig-common'.
(PID 2624) Pretending to clean up directory `dist-upgrade'.
(PID 2624) Back from recursing down `dist-upgrade'.
Pretending to remove empty directory `dist-upgrade'.
Entry matching `--protect' pattern skipped. `ostechnix.txt'
(PID 2624) Pretending to clean up directory `lxd'.

如您所见,Tmpreaper 跳过了 *.txt 删除的文件。

顺便说一下,此选项在 Tmpwatch 中不可用。

设置 cron 作业以定期删除文件

您可能不想一直手动运行 Tmpwatch/Tmpreaper。 在这种情况下,您可以设置一个 cron 作业来自动化清理过程。

安装时 盗贼, 它将创建一个每日定时任务 (/etc/cron.daily/tmpreaper)。 此作业将从中读取选项 /etc/timereaper.conf 归档并采取相应的行动。 打开文件并根据您的要求更改值。 默认情况下,Tmpreaper 将删除 7 天前的文件。 但是,您可以通过修改值来更改此设置 "TMPREAPER_TIME=7d" 在 tmpreaper.conf 文件中。

如果使用“Tmpwatch”,则需要手动创建 cron 作业并将 cron 条目放入其中。

# crontab -e

添加以下行:

0 1 * * * /usr/sbin/tmpwatch 30d /var/log/

根据上面的 cron 作业,Tmpwatch 将在每天凌晨 1 点运行并删除 30 天之前的文件。

有关设置 cron 作业的更多详细信息,请参阅以下链接。

  • Cron 作业的初学者指南

再次, 使用 Tmpwatch/Tmpreaper 命令时请小心. 在运行之前仔细检查路径以避免数据丢失。

有关更多详细信息,请参阅手册页。

$ man tmpwatch

或者,

$ man tmpreaper

相关阅读:

  • Autotrash – 一种自动清除旧垃圾文件的 CLI 工具
  • Trash-cli:类 Unix 系统的命令行垃圾桶
  • 如果目录中的文件多于 X 个,则查找并删除最旧的文件
  • 怎样在 Linux 中查找和删除未使用的包
  • 怎样使用 Ubuntu Cleaner 清理 Ubuntu 中的垃圾文件