我运行一个脚本,在其中生成一个文本文件。我们将其命名为 file-a.txt。然后我再次运行相同的脚本,并将覆盖相同的 file-a.txt 但如果当然有新内容。没关系。但现在我希望每次运行脚本时我都想保留该 file-a.txt,当我再次运行它时我希望新的“file-a.txt”是最新的新文件和“file-a.txt”现在是以前的最新文件。因此,我只需要始终拥有运行脚本后生成的最新文件,并且只保留前一个文件。我希望我解释正确。例子:
- 文件-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.txt
和file-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>
-f
daily
意味着强制,它会忽略配置文件中的设置。每天是最短的时间,不知道是否可以省略。-f
如果在最后一天已经轮换过,请确保它轮换均匀。我认为,其他选项 ( size
, notifempty
,...) 也会被忽略-f
。
如果您想要更多旧副本,请增加选项的数量rotate
。