我希望能够查找以 .backup 结尾的最新文件,并删除所有比该文件更旧的文件(但当然保留较新的文件)。
以下是目录列表的示例,您可以看到已完成的多个备份。我希望保留文件 0000000200000000000000083.00000020.backup 和 000000010000000000000082,但以某种方式删除所有较旧的内容。
我可以想到很多黑客方法来实现这一点,比如用 -mtime 进行查找并删除超过一天的数据,这可能对我有用,但不是正确的。我还可以在备份之前列出目录,然后将其与备份之后的目录进行比较,并删除之前的所有文件。但这仍然不正确。
有任何想法吗?
$ ls -ltr
total 131084
-rw-r-----. 1 cm800 cm800 0 May 6 13:58 archive_06_05_14___13_58_05
-rw-------. 1 cm800 cm800 16777216 May 6 13:58 00000001000000000000007F
-rw-------. 1 cm800 cm800 16777216 May 6 13:58 000000020000000000000080
-rw-------. 1 cm800 cm800 16777216 May 6 13:58 000000020000000000000081
-rw-------. 1 cm800 cm800 242 May 6 13:58 00000001000000000000007F.00000020.backup
-rw-------. 1 cm800 cm800 242 May 6 13:58 000000020000000000000081.00000020.backup
-rw-------. 1 cm800 cm800 16777216 May 6 14:03 000000010000000000000080
-rw-------. 1 cm800 cm800 16777216 May 6 14:06 000000020000000000000082
-rw-------. 1 cm800 cm800 16777216 May 6 14:06 000000010000000000000081
-rw-------. 1 cm800 cm800 16777216 May 6 14:07 000000020000000000000083
-rw-------. 1 cm800 cm800 242 May 6 14:07 000000020000000000000083.00000020.backup
-rw-------. 1 cm800 cm800 16777216 May 6 14:11 000000010000000000000082
答案1
使用-nt
,-ot
运算符来测试一个文件是否比另一个文件更新/更旧:
#! /bin/bash
# Find the newest backup file:
unset newest
for f in *.backup ; do
[[ $newest ]] || newest=$f # Initialize.
[[ $f -nt $newest ]] && newest=$f # Keep the newest so far.
done
# Delete all the older files:
for f in * ; do
[[ $f -ot $newest ]] && rm "$f"
done