我将这个 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
的参数。
使用 tr
和 xargs -0
是为了确保即使文件名包含空格也能正常工作。 printf
位用于处理包含换行符的文件名。
编辑:将 --
添加到 rm
args 以确保要删除的任何文件以连字符开头时的安全。
关于linux - 保留最新的 x 数量的文件删除其余的 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40104128/