22

I have googled and searched, but can't find the command that 7zip command line utility uses for making incremental backups. So can someone please share the command ?

Thanks

btw I found this link: http://wmug.co.uk/wmug/b/sean/archive/2009/03/20/powershell-amp-7zip-incremental-backup-solution.aspx . But it seems to be for differential backups, even though it says incremental.

4 Answers 4

17

Should be simple, use this to create and incrementally update the archive:

7zr u -up0q3r2x2y2z1w2 {archive}.7z {path}

This page offers a reference for the update options.

They are translated as follows:

  • p0 - If "File exists in archive, but is not matched with wildcard" then remove the file from the archive.
  • q3 - If "File exists in archive, but doesn't exist on disk" then remove the file from the archive and remove it from the filesystem upon extraction.
  • r2 - If "File doesn't exist in archive, but exists on disk" then pack the file into the archive.
  • x2 - If "File in archive is newer than the file on disk" then "compress file from disk to new archive".
  • y2 - If "File in archive is older than the file on disk" then pack the newer file into the archive.
  • z1 - If "File in archive is same as the file on disk" then reuse the packed version of the file.
  • w2 - If file size is different then pack the modified file into the archive.

Note that only the compression is incremental: that is, 7-Zip will only compress the updates, reusing compressed files that were not updated. The file with the archive will still be re-created by 7-Zip.

8
  • Hello, what do those many options mean?
    – Zhianc
    Apr 27, 2015 at 7:34
  • 1
    It's a map from a file state to an action. There are seven possible states.
    – ArtemGr
    Apr 27, 2015 at 12:06
  • 7
    It's not an incremental backup. This command makes a differential backup and creates new archive with changes since last full backup. Incremental backup tracks changes since previous incremental backup (diff of diff).
    – stil
    Feb 7, 2016 at 21:11
  • 1
    When the archive is large and the increments are small the "bit quicker" is quite substantial. Not repacking the entire archive is one of the points of the incremental backups. Also, this is not a differential backup: we're updating the main archive and not storing the difference in a separate archive. If you like the other solutions more, feel free to upvote them, there's more than one way to skin a cat.
    – ArtemGr
    Dec 12, 2018 at 23:06
  • 1
    @Basj, Sure, and that's to be expected, you'd need a special writeable-database-like file format in order for the archiver to optimize the I/O, 7-Zip never specialized in that. I've added a note in the answer. The problem with database-like formats is that they typically have a space overhead, so efficient updates and archivers very seldom do mix. I've seen some attempts to implement them, but never a finished one. D
    – ArtemGr
    Dec 15, 2020 at 1:37
12

If you were to do an incremental backup, you would need to provide 7-zip with the list of the files modified (with -i@fileList), and you would need to elaborate such list somehow. At the archive.org mirror of removed question Offline incremantal backup via thumbdrive you can find a Unix command line using md5 signatures to create the fileList.

The 7-zip update operation allows to create a secondary archive with the differences (including deleted files) occurring since the base/primary archive. That is properly named a differential backup (as stated in the question itself).

I've found an excellent article on this topic at WPCTips "Differential Backups with 7-zip"(archived). They recommend either using a GUI program (Toucan), or use this recipe for the command line:

7z u {base archive.7z} -u- -"up0q3r2x2y2z0w2!{differential.7z}" {folder to archive}

This is a bit different from the 7zr u -up0q3r2x2y2z1w2 {archive}.7z {path} proposed by ArtemGr:

  • -u- tells the main archive should not be modified
  • "-up0q3r2x2y2z0w2!{differential.7z}" specifies the target differential archive, and what action to do for each file for each condition/state: add files which are new or modified in the filesystem, remove files which are only in the 7zip archive, ignore the rest.
    Notice that the "!" character will be intercepted by bash unless it is quoted.

Just in case you are curious about the specifics of that cryptic p0q3r2x2y2z0w2

<state> | State condition
p | File exists in archive, but is not matched with wildcard.   Exists, but is   not matched 
q | File exists in archive, but doesn't exist on disk.
r | File doesn't exist in archive, but exists on disk.
x | File in archive is newer than the file on disk.
y | File in archive is older than the file on disk.
z | File in archive is same as the file on disk
w | Can not be detected what file is newer (times are the same, sizes are different)

<action> | Description 
0 | Ignore file (don't create item in new archive for this file) 
1 | Copy file (copy from old archive to new) 
2 | Compress (compress file from disk to new archive) 
3 | Create Anti-item (item that will delete file or directory during extracting). This feature is supported only in 7z format. 
7
  • 2
    Thank you for the answer Javier, and welcome to Super User. There is a policy here of summarising links in case they disappear- could you explain how the command achieves the incremental backup? (particularly the up0q3r2x2y2z0w2 part!) Thanks :-)
    – bertieb
    Aug 2, 2015 at 18:48
  • 1
    @bertieb thank you for advice. I hope it is more clear now.
    – Javier
    Aug 2, 2015 at 19:25
  • 1
    @DanielSokolowski Not sure if this answers your question. If you did an incremental backup (A+b+c+d), you will have to extract from each archive in the order you made them. If you did a differential backup (A+(b+c+d)). It is 2 archives you have to extract. It would be nice that the last archive contained information about previous archives and order of extraction, so extraction could be made with a single command. But I am not aware of such feature.
    – Javier
    Feb 17, 2016 at 18:38
  • 1
    article you share does not open @Javier
    – alper
    May 20, 2018 at 11:20
  • 1
    Thanks @alper . Archive.org has some snapshot of the extint WPC Tips article at web.archive.org/web/20160822111118/http://www.wpctips.com:80/… . I guess I will have to amend the response.
    – Javier
    Jun 4, 2018 at 10:29
6

You can easily do an incremental backup via changing the direction in time. i.e. you always keep the latest backup as a full copy and keep differential files into the past.

# create the difference step into the past
7z u {base archive.7z} {folder to archive} -mx=9 -u- -up1q1r3x1y1z0w1!{decrement.7z}

# update the Archive to the latest files
7z u {base archive.7z} {folder to archive} -mx=9 -up0q0x2

The base Archive always contains the latest version and via applying the "decrements" step by step you can recreate older Versions. With a little bit scripting you can apply the right numbering to the decremental files.

1
  • Can you kindly elaborate on this? I'd love to see an example of creating say a current backup, backup 1 day ago, backup 2 days ago. And then an example of restoring the '2 days ago' backup. Sep 22, 2018 at 3:28
0

In a batch file, with enabledelayedexpansion, you need to quote the "!" with two ^^ like this

7z u {existing archive.7z} -u- -up0q3r2x2y2z0w2^^!{new differential.7z} {folder or files to archive}

Took me a while to see that one.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .