【问题标题】:How can I delete the oldest n group of files with the same prefix?如何删除具有相同前缀的最旧的 n 组文件?
【发布时间】:2020-04-16 08:37:29
【问题描述】:

在 Linux 中,我使用 InfluxDB,它可以备份数据库以用于存档目的。每个备份都包含一系列具有相同前缀“/tank/Backups/var/Influxdb/20191225T235655Z”的文件。和不同的扩展。

我想编写一个 bash 脚本,它首先删除最旧的现有备份,然后创建一个新备份(这里我只粘贴删除):

ls -tp /tank/Backups/var/Influxdb/* | grep -v '/$' | sed -E 's/\..+//' | \
  sort -ru | sed 's/$/.*/' | tail -n +4 | xargs -d '\n' -r rm --

但是,当我以“sudo”身份运行脚本时,我得到了

rm: cannot remove '/tank/Backups/var/Influxdb/20191225T235655Z.*': No such file or directory

当我运行引用的脚本时,除了最新的部分,我得到:

/tank/Backups/var/Influxdb/20190930T215357Z.*
/tank/Backups/var/Influxdb/20190930T215352Z.*

这是正确的。另外,如果我手动编写

sudo /tank/Backups/var/Influxdb/20190930T215357Z.*

命令成功。

为什么脚本会报错?

我使用的是 Ubuntu 18.04,文件夹“/tank”是一个 ZFS 卷。

【问题讨论】:

  • 您可能想研究 logrotate 而不是重新发明轮子。
  • @Robert 我认为它用于旋转日志。我要备份数据库

标签: linux bash xargs


【解决方案1】:

最好这样做:

find /tank/Backups/var/Influxdb/* -mtime +5 -delete

删除超过 5 天的文件。

然后,你可以运行下一条命令

【讨论】:

    【解决方案2】:

    解释错误

    此答案仅用于解释错误并更深入地了解正在发生的事情。如果您只是在寻找优雅的解决方案,请搜索其他答案。

    当我运行引用的脚本时,除了最新的部分,我得到:

    /tank/Backups/var/Influxdb/20190930T215357Z.*
    /tank/Backups/var/Influxdb/20190930T215352Z.*
    

    这是正确的

    列出的字符串不是您想要的。当您将这些路径传递给rm 时,它会将它们视为文字字符串,即名称以文字* 结尾的两个文件。由于您没有此类文件,因此您会收到错误消息。

    当您在控制台中手动键入rm * 时,bash(不是rm!)会globbingbash 搜索文件并将* 替换为找到的文件列表。只有在那之后bash 才会执行rm foundFile1 foundFile2 ...rm 永远不会看到 *

    管道内的字符串不是由bash 处理的,而是由管道中的命令处理的,在你的情况下是rmrm 不通配符。

    您可以在管道中运行bash,并让它扩展您之前插入的*。为此,请将管道中的最后一个命令替换为 xargs -r bash -c 'rm -- $*' --。但是,请注意这里没有引用您的路径。如果文件名中有空格或文字*,则命令将中断。这对于通配符是必需的,因为引用的 "*" 不会被 bash 扩展。

    要引用您的文件,您必须在 bash 命令中插入 * glob:

    ls -tp /tank/Backups/var/Influxdb/* | grep -v '/$' | sed -E 's/\..+//' |
    sort -ru | tail -n +4 | xargs -d\\n -L1 -r bash -c 'rm -- "$0."*'
    

    上述命令只是对您的命令的简单修复。它既不优雅也不十分健壮。强烈建议使用find 之类的工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-16
      • 2020-10-26
      • 2011-11-06
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      相关资源
      最近更新 更多