如果 Linux 中一个目录中的文件超过 X 个,则查找并删除最旧的文件

我的硬盘中有很多电影,我根据电影类型将它们存储在不同的文件夹中。 现在,我只想在一个目录中保留特定数量的电影文件,并删除其他所有内容。 更重要的是,我只想删除最旧的文件。 这样我可以在每个文件夹中保持恒定数量的文件。 由于我有很多文件分散在许多文件夹中,因此转到每个文件夹,搜索最旧的文件并手动删除它们是非常耗时的过程。 在寻找一种简单的方法来做到这一点时,我找到了以下解决方案。 继续阅读。 这并不难。

在 Linux 的目录中查找和删除最旧的文件

假设您想查找并删除最旧的文件(如果有) 超过10个文件 在一个目录中。 你会怎么做? 这很简单。

取以下目录命名 ostechnix 作为一个 example. 让我们使用命令检查此目录中有多少文件:

$ find ostechnix/ -type f | wc -l

或 cd 进入该目录并运行:

$ ls | wc -l

样本输出:

33
计算目录中的文件

正如你在上面看到的 example目录 ostechnix 包含 33 个文件。 我不想在这个目录中有 33 个文件。 我想删除所有最旧的文件,只保留 10 个文件。

现在,让我们在这个目录中查找并删除最旧的文件(如果它包含超过 10 个文件)。 为此,请转到该目录:

$ cd ostechnix

并且,运行以下命令:

$ ls -1t | tail -n +11 | xargs rm

或者,

$ ls -1t | tail -n +11 | xargs rm -f

在哪里,

  • ls :列出目录内容。
  • -1t 1(数 ) 表示的输出 ls 应该是每行一个文件。 t 表示按修改时间排序内容,最新的在前。
  • tail :输出文件的最后一部分。
  • -n +11 : 输出最后 NUM 行,而不是最后 10 行; 或使用 -n +NUM 从第 NUM 行开始输出
  • xargs :从标准输入构建和执行命令行。
  • rm -f : 删除文件或目录。 f 表示忽略不存在的文件和参数,从不提示。 这意味着如果文件少于 10 个,此命令将不会显示任何错误消息。
  • | – 这是一个管道。 它通常是由一个控制运算符分隔的一个或多个命令的序列 | 或者 |&.

因此,如果当前工作目录中的文件超过 10 个,上述命令将删除最旧的文件。 要在删除最旧的文件后验证目录中有多少文件,只需运行:

$ ls | wc -l

更新:

如果文件名包含空格,则上述命令将不起作用。 因为, xargs 命令将空白字符(制表符、空格、换行符)作为分隔符。 在这种情况下,您可以仅针对换行符('n') 和 -d 选项如下:

$ ls -1t | tail -n +11 | xargs -d 'n' rm -f

希望这可以帮助。

推荐阅读:

  • 如何在 Linux 中查找和删除超过 X 天的文件
  • 删除在 Linux 上一段时间未访问的文件