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

我们已经介绍了如何手动 在 Linux 中使用“find”命令查找和删除超过 X 天的文件. 今天我们将做同样的事情,但前提是文件在一段时间内未被访问。 打招呼 “时间表”,一个命令行实用程序,用于递归删除在给定时间内未访问的文件。 不只是文件,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

Tmpwatch 在大多数 Linux 发行版的默认存储库中都可用。

在 Fedora, CentOS, RHEL, AlmaLinux 和 Rocky Linux,你可以使用命令安装它:

$ sudo dnf install tmpwatch

在 openSUSE 上:

$ sudo zypper install tmpwatch

在 Debian 及其衍生产品(如 Ubuntu)上,Tmpwatch 有不同的名称,即 转发器. Tmpreaper 主要基于 `tmpwatch-1.2/1.4′ by 埃里克·特兰 来自红帽。 现在,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 选项。

例如,下面的命令将删除 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 作业来自动执行清理过程。

安装时 转发器, 它将创建一个每日 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 中的垃圾文件

CLID删除文件LinuxLinux命令Linux提示TmpreaperTm​​pwatch