linux - 保留最新的 x 数量的文件删除其余的 bash

标签 linux bash debian

我将这个 bash 脚本作为 crontab 每小时运行一次。我想将最新的 1,000 张图像保存在一个文件夹中,删除最旧的文件。我不想按 mtime 删除,因为如果没有新文件正在上传,我想保留它们,如果图像是 1 天或 50 天,可以保留,我只想要图像 1,001 上传时(最新)image_1 (最旧的)将被删除,在文件夹中循环以保留 1,000 张图像的静态数量。

这行得通,但是在任何时候,在它执行时现在可能有 1,200 个。每隔一分钟运行一次 crontab 似乎有点矫枉过正。我可以在文件夹达到 1,001 张图像后自动执行吗?基本上我希望文件夹能够 self 扫描并保留最新的 1,000 张图像,删除最旧的图像。

#!/bin/sh
cd /folder/to/execute; ls -t | sed -e '1,1000d' | xargs -d '\n' rm

最佳答案

keep=10 #set this to how many files want to keep
discard=$(expr $keep - $(ls|wc -l))
if [ $discard -lt 0 ]; then
  ls -Bt|tail $discard|tr '\n' '\0'|xargs -0 printf "%b\0"|xargs -0 rm --
fi

这首先计算要删除的文件数,然后将它们安全地传递给 rm。它有意使用负数,因为它可以方便地用作 tail 的参数。

使用 trxargs -0 是为了确保即使文件名包含空格也能正常工作。 printf 位用于处理包含换行符的文件名。

编辑:将 -- 添加到 rm args 以确保要删除的任何文件以连字符开头时的安全。

关于linux - 保留最新的 x 数量的文件删除其余的 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40104128/

相关文章:

c++ - stat64 在 64 位 ubuntu 上返回 32 位 st_size

bash - 终端 shell : How to use echo instead of a text file as command-line arguments

linux - crontab bash 脚本未运行

node.js - 软件包 'npm' 没有安装候选者

docker - 如何在 docker 容器中安装 docker?

html - Raspberry Pi Apache2 不使用 HTML 访问用户文件

ruby - 如何终止 transmission-cli

linux - 在 Linux 中重命名多个文件并删除多余字符

linux - 当从同一个 shell 调用时,跨应用程序的多个实例维护一个 session

linux - bash 脚本与 SSH 控制台不同