【问题标题】:Keep newest x amount of files delete rest bash保留最新的x个文件删除其余的bash
【发布时间】:2016-10-18 09:12:34
【问题描述】:

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

这可行,但是在每个小时,到它执行时现在可能有 1,200 个。每隔一分钟运行一次 crontab 似乎有点过头了。一旦文件夹达到 1,001 张图像,它会自动执行,我可以这样做吗?基本上我希望文件夹能够自我扫描并保留最新的 1000 张图像,删除最旧的图像。

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

【问题讨论】:

  • 添加新文件的方式是什么?
  • 是用户上传的图片。这是用于聊天的,当他们上传时,它将作为 username_timestamp(.gif/jpg/png) 上传,laravel php 框架正在通过聊天进行实际的图像上传。所以它是随机的,可能是一分钟 50 张图片,或者一天 50 张图片。编辑:此脚本按时间戳省略最新的 1,000 个文件,然后删除文件夹中剩余的所有内容。
  • 如何编写某种 webhook 或本地脚本来检查上传图像后的图像总数?那么当它达到 1000 时触发 shell 命令?会不会太矫枉过正了?
  • 这是一个本地脚本。 Webhook 是个好主意。你有另一个本地脚本的建议吗?基本上每个新图像都会运行一个脚本来检查文件夹计数,如果超过 1,000 个运行该脚本?感谢您的回复!

标签: linux bash debian


【解决方案1】:
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 以确保安全。

【讨论】:

  • 这很完美,只是顺序相反。它保留了 10 个最旧的文件。不过谢谢!这回答了我的问题。这就是我需要的,刚才我需要编辑以保留最新的文件。
  • 你能告诉我你是怎么得到这个结果的吗?我通过读取输出在本地对其进行了测试,然后在一个目录中实际使用它,该目录间隔一秒创建了 19 个文件。它为我删除了最旧的文件(感谢tail)。
  • 对不起埃里克。我正在使用一个脚本来生成要测试的文件,并且说脚本生成得如此之快以至于时间戳是相同的。造成这种混乱。
  • 这 100% 有效并回答了我的问题。非常感谢。标记为已回答。
  • 我的第一个测试脚本有同样的时间问题。我不得不在循环中添加一个睡眠。
【解决方案2】:

尝试以下脚本。它首先检查当前目录中的计数,然后,如果计数大于 1000,它会评估差异,然后获取最旧的此类文件。

    #/bin/bash
    count=`ls -1 | wc -l`
    if [ $count -gt 1000 ]
    then
     difference=${count-1000}
     dirnames=`ls -t * | tail -n $difference`
     arr=($dirnames)
     for i in "${arr[@]}"
      do
         echo $i
      done
    fi

【讨论】:

  • 我做错了吗?我创建了 2,000 个文本文件,并运行了 bash 脚本。它只输出一个文件“1000”,并像运行 cat 一样列出 bash 中的每个文件。 i.imgur.com/McuD6vY.png 我尝试了 1,500 以确保它不是我的目标,同样的结果。 i.imgur.com/FxrqXHZ.png感谢您的快速回复!
  • 如果我理解正确,您想要创建的文件早于最新的 1000 个文件吗?
  • 我要扫描文件夹,如果文件超过1000个,先删除旧文件,直到只剩下1000个。保留最新的 1,000 个文件。
  • 是的,所以这个脚本的作用是列出所有最旧的文件,没有最新的 1000 个文件。试一试,在一个目录中创建 3~4 个文件,将参数 1000 更改为@987654325 @ 在脚本每个位置,然后在那里运行脚本,它应该打印旧文件,不包括最新的 2 个文件。
  • > 转换为 -gt 以进行数字比较
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
相关资源
最近更新 更多