如何保留最新文件和之前最新文件?

如何保留最新文件和之前最新文件?

我运行一个脚本,在其中生成一个文本文件。我们将其命名为 file-a.txt。然后我再次运行相同的脚本,并将覆盖相同的 file-a.txt 但如果当然有新内容。没关系。但现在我希望每次运行脚本时我都想保留该 file-a.txt,当我再次运行它时我希望新的“file-a.txt”是最新的新文件和“file-a.txt”现在是以前的最新文件。因此,我只需要始终拥有运行脚本后生成的最新文件,并且只保留前一个文件。我希望我解释正确。例子:

  1. 文件-a. (生成第一个文件)2.再次运行脚本,现在 file-a 是最新的,但我想保留以前的 file-a 的内容; ETC

我尝试制作文件的副本,例如

  • cp file-a file-a-old 但尝试了其他方法但不成功。

答案1

让您的脚本生成一个临时文件,然后用于mv -b覆盖前一个文件。mv将创建一个备份file-a.txt~

-b, --backup[=CONTROL]备份每个现有的目标文件

script_generating_tmp_file && mv -b "file-a.txt.tmp" "file-a.txt"

你会得到:

$ ls -1
file-a.txt # <-- latest file
file-a.txt~ # <-- previous file

答案2

您可以编写一个调用原始脚本的新脚本。假设原始脚本名为original-script;我们称这个为wrapper-script

#!/usr/bin/env bash

# Save a copy of latest file-a.txt before generating a new one;
# but don't bother trying if file-a.txt does not exist.
if test -f file-a.txt; then
    cp -a file-a.txt file-a-old.txt
fi

original-script # Run script that generates file-a.txt here.

逻辑如下:

第一次通过,应该还没有file-a.txt,所以file-a-old.txt没有创建。现有脚本会生成file-a.txt,但不会生成任何内容file-a-old.txt

所有其他时间都file-a.txt存在,因此我们制作了一个名为 的副本file-a-copy.txt。此时,有2个相同的文件:file-a.txtfile-a-old.txt.original-script运行时,它会覆盖file-a.txt,但file-a.old.txt仍然保留。

original-script如果这对您的用例有意义,您也可以将此逻辑添加到自身中。否则,您可以运行wrapper-script而不是original-script获得您想要的行为。

答案3

您可以使用 logrotate 对文件进行两次备份。这样你将拥有:

file
file.1
file.2

首先,创建一个配置文件,如下所示:

<path to your file> {
    rotate 2
    daily
    size 1
    notifempty
    missingok
}

然后你跑

logrotate -f <path to config file>

-fdaily意味着强制,它会忽略配置文件中的设置。每天是最短的时间,不知道是否可以省略。-f如果在最后一天已经轮换过,请确保它轮换均匀。我认为,其他选项 ( size, notifempty,...) 也会被忽略-f

如果您想要更多旧副本,请增加选项的数量rotate

相关内容