我正在寻找一种简单的方法来备份过去 24 小时内更改过的文件并创建一个每日 7zip 文件(我不需要权限或用户,只需要文件)。
使用以下命令,我可以将已更改文件的列表传递给 7Zip,效果很好。但是,7zip 中没有存储已更改文件的路径信息。
/usr/bin/find /local-storage/public_html/ -type f -size -25M -mtime -1 -print | /usr/bin/xargs -n 1 /usr/bin/7z a -t7z -m0=lzma -mx=9 /local-storage/public_html_2013-09-03.7z
因此,如果我现在尝试提取该 7zip 文件,它只在 1 个目录中,并且没有路径。
希望有人能指出我遗漏了什么:-)
答案1
我不确定这7z
是否可以做到这一点,这似乎就是他们在手册页的这一部分中的意思:
On Linux/Unix, in order to backup directories you
must use tar :
- to backup a directory : tar cf - directory | 7za a -si directory.tar.7z
- to restore your backup : 7za x -so directory.tar.7z | tar xf -
相反,我建议创建一个未压缩的 tar 包并然后使用 7z 压缩:
find /local-storage/public_html/ -type f -mtime -1 -print0 |
xargs --null tar rf foo.tar &&
7za a -t7z -m0=lzma -mx=9 /local-storage/public_html_2013-09-03.tar.7z foo.tar &&
rm foo.tar
这将创建一个名为 的文件public_html_2013-09-03.tar.7z
,其中包含 tar ball foo.tar
。然后,您可以提取所有内容并保留正确的路径(如果不存在目录,则会创建目录并覆盖文件,因此请确保您知道自己在做什么):
7z x -so foo.tar.7z | tar rf -
答案2
它似乎7z
不太适合你想要做的事情。不过,如果你打算使用7z
,你仍然可以通过创建临时文件树并从中创建存档来做你需要的事情。例如,你可以将以下命令列表放入 shell 脚本中:
cd /tmp
find /local-storage/public_html -type f -size -25M -mtime -1 -print0 | xargs -0 tar -rf public_html_2013-09-03.tar
tar -xf public_html_2013-09-03.tar
7z a -r -t7z -m0=lzma -mx=9 /local-storage/public_html_2013-09-03.7z local-storage
rm -rf local-storage public_html_2013-09-03.tar
这就是基本思想。注意-r
传递给的7z
。您可以通过更好的临时目录处理、自动生成日期字符串等来增强此功能。
答案3
感谢大家的意见。我找到了一种方法,虽然不是很好,但对我的情况很有效。我参考了这里发帖人的一些想法,并创建了以下 bash 脚本。
#!/bin/bash
TIMESINCELINUXSTART="$(date +%s)"
YESTERDAY=`date -d "1 days ago" '+%Y-%m-%d'`
cd /local-storage/public_html/
/usr/bin/find . -type f -size -25M -mtime -1 > /tmp/"$TIMESINCELINUXSTART"-changed-files.txt
/bin/mkdir -p /tmp/"$TIMESINCELINUXSTART"/public_html
/usr/bin/rsync --files-from=/tmp/"$TIMESINCELINUXSTART"-changed-files.txt /local-storage/public_html /tmp/"$TIMESINCELINUXSTART"/public_html/
/usr/bin/7z a -t7z -m0=lzma -mx=9 /local-storage/snapshots/public_html-changes-during-"$YESTERDAY".7z /tmp/"$TIMESINCELINUXSTART"/public_html
/bin/rm /tmp/"$TIMESINCELINUXSTART"-changed-files.txt
/bin/rm -rf /tmp/"$TIMESINCELINUXSTART"
如果有人对此有改进或意见,欢迎您发表评论。我唯一想补充的是,如果未找到更改的文件,则不创建 7zip 文件。