![编辑时备份文件并为其添加时间戳?](https://linux22.com/image/865537/%E7%BC%96%E8%BE%91%E6%97%B6%E5%A4%87%E4%BB%BD%E6%96%87%E4%BB%B6%E5%B9%B6%E4%B8%BA%E5%85%B6%E6%B7%BB%E5%8A%A0%E6%97%B6%E9%97%B4%E6%88%B3%EF%BC%9F.png)
每次文件更改时,我都想将特定文件备份到另一个文件夹中。理想情况下,备份文件在备份时应带有时间戳。例如:
目录工作文件
~/workfile
目录备份文件
~/backup/workfile-2014-11-24-10:30
~/backup/workfile-2014-11-24-11:10
~/backup/workfile-2014-11-24-12:40
~/backup/workfile-2014-11-24-15:42
~/backup/workfile-2014-11-24-16:30
我希望有一个不使用 GUI 的解决方案。
答案1
我不太清楚这里的用例是什么。但是,与其根据特定时间戳对文件进行“备份”,不如只存储版本之间的更改,不是更好吗?!
如果你的文件是非二进制的,比如文本或源代码,使用git
如果它们是二进制的,我会使用 rsnapshot,因为它会自动创建一个包含每个文件版本的并行文件夹结构,但只保留实际有更改的文件的副本(节省空间)
根据快照的时间将其保存在文件夹中。例如 day2/hour3
将日期存储在文件名本身中似乎是多余的。rsnapshot 通过它为备份创建的文件夹结构保留该信息,您也可以在文件本身的日期上看到它。
GIT 将向您显示每个文件提交的每个更改的提交日期。
答案2
未经测试,但我会以这种方式解决问题:
剧本:
#!/bin/bash
BACKUP_LOCATION='backup'
FILE_TO_MONITOR='workfile'
PREVIOUS_MD5='000'
if [ ! -d "$BACKUP_LOCATION" ]
then
mkdir -p "$BACKUP_LOCATION"
echo "Init backup dir..."
fi
while true
do
MY_TIMESTAMP=`date +"%Y-%m-%d-%H:%M:%S"`
MY_MD5=`md5sum "$FILE_TO_MONITOR"`
if [ "$MY_MD5" != "$PREVIOUS_MD5" ]
then
cp -f "$FILE_TO_MONITOR" "${BACKUP_LOCATION}/${FILE_TO_MONITOR}-${MY_TIMESTAMP}"
PREVIOUS_MD5=$MY_MD5
echo "File changed at $MY_TIMESTAMP."
fi
done
程序:将此脚本作为守护进程运行。您甚至可以将输出重定向到日志文件。
答案3
在我看来玉米工作是比无限循环更好的替代方案。我假设~/backup
文件夹已经存在。可以设置玉米工作n
根据需要每隔几分钟运行以下脚本。它将达到目的。
每隔 5 分钟运行一次脚本
从终端打开用户的 crontab(cron 配置文件),crontab -e
添加以下行以每 5 分钟运行一次脚本,
*/5 * * * * /path/to/script
不要忘记赋予脚本执行权限:chmod u+x /path/to/script
剧本
#!/bin/bash
msrc="/home/$USER"
mdst="/home/$USER/backup"
msrcfile="workfile"
mnewfile="$msrcfile"-$(date +"%Y-%m-%d-%H:%M")
checkfile="$(for i in "$mdst"/*; do echo "$i"; done | xargs ls -1t > /dev/null 2>&1 | head -1)"
if [[ "$msrc"/"$msrcfile" -nt "$checkfile" ]]; then
cp "$msrc"/"$msrcfile" "$mdst"/"$mnewfile"
fi
从man bash
:
CONDITIONAL EXPRESSIONS
file1 -nt file2
True if file1 is newer (according to modification date) than file2, or if file1
exists and file2 does not.
从man ls
:
-t sort by modification time, newest first