用于计算文件的Shell脚本,然后删除最旧的文件

Nic*_*ard 51 linux bash shell

我是shell脚本的新手,所以我需要一些帮助.我有一个填满备份的目录.如果我有超过10个备份文件,我想删除最旧的文件,以便剩下10个最新的备份文件.

到目前为止,我知道如何计算文件,这似乎很容易,但如果计数超过10,我如何删除最旧的文件?

if [ls /backups | wc -l > 10]
    then
        echo "More than 10"
fi
Run Code Online (Sandbox Code Playgroud)

Dal*_*und 87

试试这个:

ls -t | sed -e '1,10d' | xargs -d '\n' rm
Run Code Online (Sandbox Code Playgroud)

这应该处理文件名中的所有字符(换行符除外).

这里发生了什么?

  • ls -t按修改时间的降序列出当前目录中的所有文件.即,最近修改的文件是第一个,每行一个文件名.
  • sed -e '1,10d'删除前10行,即10个最新文件.我用这个而不是tail因为我永远不记得我是否需要tail -n +10tail -n +11.
  • xargs -d '\n' rm收集每个输入行(没有终止换行符)并将每行作为参数传递给rm.

与此类任何东西一样,请在安全的地方进行实验.

  • 我收到一个错误:`xargs:非法选项 - d` (3认同)
  • @delinquentme OP要求留下10个最新文件,并从`ls`的输出中删除它们,管道的以下部分删除所有旧文件. (3认同)
  • @DaleHagglund,我刚刚了解了 `-r` 选项,如果有任何非空行,它在使用时只运行 xargs。因此,将该选项添加到 `xargs` 可以消除错误 (3认同)
  • 完美,直截了当地回答这个问题.谢谢. (2认同)
  • 这不是要求删除 10 个最旧的...而不是 10 个最新的吗?使 sed -e '1,10d' .. 不正确? (2认同)

mah*_*ard 23

find 是这类任务的常用工具:

find ./my_dir -mtime +10 -type f -delete
Run Code Online (Sandbox Code Playgroud)

说明

  • ./my_dir 你的目录(用你自己的替换)
  • -mtime +10 超过10天
  • -type f 只有文件
  • -delete没有惊喜.在执行整个命令之前删除它以测试find过滤器

并注意./my_dir存在以避免不良意外!

  • 关于这个解决方案的几点:(1)如你所说,使用`-mtime 10`选择超过十天的文件进行删除.然而,OP的问题要求十个最老的,而不是所有超过十天的文件.(2)`find`将遍历整个目录树,删除任何级别的文件.在这里,OP也不会要求这种行为. (5认同)
  • 在之前的评论中,我错误地说 OP 要求删除十个最旧的文件。事实上,OP 要求保留十个最新文件,并删除所有旧文件。很抱歉造成混淆,但在任何一种情况下,`-mtime 10` 都不能完全满足要求。 (3认同)

Pau*_*ce. 11

做这种事情的正确方法是logrotate.

  • `logrotate`是一个很好的答案,但它可能有点重量:它需要一个配置文件,它至少有点偏向于日志文件的半官方场所.此外,它是否假设它应首先旋转日志(即,将.N重命名为.N + 1),然后删除最旧的?至少按照书面形式,OP的问题并不意味着固定名称的轮换. (2认同)

小智 8

确保你的pwd是删除文件的正确目录(假设文件名中只有常规字符):

ls -A1t | tail -n +11 | xargs rm
Run Code Online (Sandbox Code Playgroud)

保留最新的10个文件.我用相机程序'motion'来保存最新的帧抓取文件.感谢所有正在进行的答案,因为您告诉我该怎么做.