为什么我的“如果目录中超过 x 个则删除最旧的文件”shell 脚本不起作用?

为什么我的“如果目录中超过 x 个则删除最旧的文件”shell 脚本不起作用?

我真的很抱歉这个可怕的标题,这是我能用最好的措辞来形容它。

所以我有一个备份脚本,它创建一些服务器数据的备份 tar 并将其存储在 /server/backups 中,但是我只需要上周的备份,因此我创建了这个脚本作为每周任务运行并清理我的备份文件夹:

#!/bin/bash
#initializing a with the amount of backup archives and b with the target max
a=find /server/backups/ -type f | wc -l
b=14

#if there are more backup files than target max
#delete the oldest files
if [ $a > $b ]
then
    ls -1t /server/backups/ | tail -n +15 | xargs rm -f
fi  

但它不起作用。我对 Linux 很陌生,我不知道如何“调试”它。

答案1

a=find /server/backups/ -type f | wc -l

这将运行命令/server/backups/并将环境变量a设置为find。或者实际上它可能只是因为尾随斜杠而给出错误。你想要的是一个命令替换

if [ $a > $b ]

这里>是一个细绳比较,因此 例如2会大于14。您应该引用变量,但如果它们只保存数字,这可能不是问题。

ls -1t /server/backups/ | tail -n +15 | xargs rm -f

在这里,包含空格、引号或换行符的文件名存在明显的问题(因为xargs默认情况下如何解释其输入,并且因为tail处理行)。但如果我们可以忽略这一点,如果你的文件名“不错”,你有 GNU xargs,那么你可以运行

ls -t /server/backups/ | tail -n +15 | xargs -d '\n' -r rm

tail因为如果少于 15 行, 输出将为空。-d '\n'告诉 xargs 读取整行,而不是默认情况下可能被引用的空格分隔的单词,并-r告诉它在没有任何参数的情况下不运行该命令。两者都不是标准功能。

相关内容