如何在 Linux 上使用 7z 存储完整路径

如何在 Linux 上使用 7z 存储完整路径

我正在寻找一种简单的方法来备份过去 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 文件。

相关内容