zpaqfranz Wiki 部分中文机翻

没有全部翻译 Wiki ,剩下一些感觉自己用不上,能用上的也不会搜到这篇文章

zpaqfranz Wiki 机翻

命令

1on1

删除目标文件夹中与源文件夹同名且哈希相同的文件

a

向存档中添加或追加文件

autotest

编译源代码后的自测试(自动测试隐藏错误)

b

CPU算力评估(独创franzomips速度指数)

backup

带加固的多部分备份

c

将一个主目录与一个或多个从目录进行比较

consolidatebackup

合并多部分备份

cp

友好的文件复制带预计时间(可恢复)

d

单个文件夹内文件去重(无怜悯)

dir

更好的目录(是的,Windows 的目录)

dirsize

显示累积文件夹大小

e

当前文件夹提取文件(多个)

find

带通配符搜索文件(多个)

fzf

列出存档文件名(原始和未处理)

f

释放磁盘空间(用于可靠性测试=可靠性测试或擦除隐私)

命令 1on1 (删除 folder2 中与 folder1 同名哈希值相同的文件) 我们需要通过文件夹对比实现去重 用于创建"精简版"文件夹,删除那些被复制粘贴过的重复文件

试运行(仅计算哈希和文件名,多线程模式)

zpaqfranz 1on1 c:\dropbox -deleteinto z:\pippero2 -ssd

实际运行(即使0个文件也执行操作)

zpaqfranz 1on1 c:\dropbox -deleteinto z:\pippero2 -zero -kill

真实运行,使用 XXH3,使用 *

zpaqfranz 1on1 c:\dropbox -deleteinto z:\pippero2 -xxh3 -kill -forcezfs
命令 a (添加或追加文件到存档) 将文件中的更改附加到归档,如果归档不存在则创建它。

示例 与 7.15 的差异

Files 是用空格分隔的文件和目录名称列表。 如果名称是目录,则递归包含其中所有文件和子目录。 在 Windows 中,文件可以在路径的最后一个组件(最后一个斜杠之后)包含通配符 *?* 匹配任何字符串,? 匹配任何字符。 在 Unix/Linux 中,通配符由 shell 展开,效果相同。

更改是指文件或 files 中任何文件或目录及其任何深度子目录的添加、更新或删除。如果文件或目录的大小或最后修改日期(精确到 1 秒),或者 Windows 属性或 Unix/Linux 权限(如果已保存)在内部和外部版本之间存在差异,则认为文件或目录已更改。不比较文件内容。如果属性改变但日期未改变,则在归档中更新属性,假定文件内容未改变。

通过将文件沿内容相关的边界分割成片段,计算它们的 SHA-1 哈希值,并与归档中已存储的哈希值进行比较来添加文件。如果哈希值匹配,则假定片段是相同的,并且只保存指向先前压缩片段的指针。 zpaqfranz 默认情况下会通过 CRC-32 对 SHA-1 冲突进行双重检查:在这种情况下,如果检测到冲突,会抛出阻塞错误 (GURU)(使用 -verify)。 不匹配的片段被打包成块,压缩,并附加到归档。 这极其重要:只修改 .zpaq 归档的最后一部分,所有初始部分保持不变。这使得 rsync --append 等机制只能传输数据的修改部分,而不是整个文件。

对于每个添加或更新的文件或目录,以下信息会保存在归档中:

  • 压缩后的内容;
  • 片段的 SHA-1 哈希值;
  • 文件或目录在 files 中出现的名称以及任何尾随路径;
  • 最后修改日期,精确到 1 秒;
  • Unix/Linux 权限或 Windows 属性;
  • 整个文件的 CRC-32 和选定的哈希值(默认 xxhash64)

默认行为:

  • 其他元数据,如所有者、组、ACL、最后访问时间等,不保存;
  • 符号链接不保存或跟随;
  • 硬链接像普通文件一样被跟随;
  • 特殊文件类型,如设备、命名管道和命名套接字,不保存;
  • Windows 版本默认保存备用数据流 (ADS),除非强制(-forcewindows 或 -715);
  • 默认情况下,路径中包含 .zfs 的文件将被忽略(除非 -forcezfs 或 -715);
  • .xls/.ppt 文件默认总是被“硬”附加到文件中(除非 -xls)。

分卷

如果归档是分卷的,zpaqfranz 将使用下一个可用的分卷号创建一个新分卷。例如:

    zpaqfranz a "arc??" files   (创建 arc01.zpaq)
    zpaqfranz a "arc??" files   (创建 arc02.zpaq)
    zpaqfranz a "arc??" files   (创建 arc03.zpaq)
    zpaqfranz x "arc??"         (提取所有分卷)

注意:不要忘记双引号!

注释

使用 -comment sometext 开关可以为当前版本的归档添加“sometext”标记。这将更容易搜索或提取。警告:文本不应包含空格或非 ASCII 字符,最重要的是,应该唯一。版本注释没有“重复”检查。如果您多次添加相同的注释,以后将无法使用它来提取数据。通过正常使用 -until 仍然可以实现。

“奇怪”的事情

  • 如果任何文件无法读取(例如,权限被拒绝),则会跳过该文件并报告警告。但是,其他文件仍然会被添加,并且更新仍然有效。
  • 如果文件可读但大小不是预期的大小(例如,在归档期间发生了变化等),输出中会写入 WARN (38385);文件添加到归档中,并且全局结果将变为 ERROR。
  • 如果文件可读,但读取的大小为零(例如,损坏、连接丢失...),输出中会写入 ERROR (38383);文件添加到归档中,并且全局结果将变为 ERROR。文件的哈希值(zpaqfranz 默认存储)变为 !ERROR!,并且除非使用 -force,否则文件将不会被列出或提取。

文件列表是在初始扫描期间生成的,对于大型作业,即使在实际从介质读取之前数小时也可能发生。显然,zfs 快照是避免此类本质上...不可避免的不一致性的建议方法。在某些情况下,VSS 可用于减轻 Windows 上的风险。

可以使用 i (info) 命令或 l (list) 命令快速找到这种奇怪的文件。

zpaqfranz i c:\nz\ugo3.zpaq
zpaqfranz l c:\nz\ugo3.zpaq
zpaqfranz l c:\nz\ugo3.zpaq -force -summary -checksum

如果 archive 是 ""(带引号的空字符串),则 zpaqfranz 会像创建新归档一样压缩文件,但不写入磁盘(基准测试或调试)。

更新是事务性的。如果在完成更新之前 zpaq 被中断,则部分附加的数据将被忽略并在下次更新时覆盖。这是通过先附加临时更新头,附加压缩数据和索引,然后最后一步更新头来实现的。

详细程度

更新归档时,程序将报告完成百分比、剩余估计时间以及其他信息。此行为可通过 -noeta、-verbose、-pakka、-debug、-summary 进行更改。

脚本

执行后可以通过 3 个不同的开关运行某些脚本

  • exec_ok
  • exec_warn
  • exec_err
zpaqfranz a (...) -exec_err "d:\script\my very own script for errors.bat"

作为 zpaqfranz 的一般规则,只考虑多个开关中的第一个:-exec_on pippo.sh -exec_ok pluto.sh -exec_ok paperino.sh 等同于 -exec_ok pippo.sh

特定开关

-test

对所有添加的文件进行彻底检查,从文件系统重新读取它们。这提供了充分的保证,但会降低过程速度,尤其是在网络上操作时。

-f

-force

使用 add 时,即使最后修改日期没有改变,也尝试添加文件。只有当文件确实不同时才会添加文件,这是基于计算和存储的 SHA-1 哈希值进行比较的。

-index indexfile

使用 add 时,创建 archive.zpaq 作为要附加到远程归档的后缀,假定该远程归档与 indexfile 相同,只是 indexfile 不包含压缩文件内容 (D blocks)。然后通过附加 archive.zpaq 的副本(不包含 D blocks)来更新 indexfile。使用 extract 时,指定为 archive.zpaq 创建的索引,并且不提取任何文件。 目的是在不使用大量本地磁盘空间的情况下维护异地备份。常规用法是在远程站点附加后缀并在本地删除它,只保留小得多的索引。例如:

zpaqfranz a part files -index index.zpaq
cat part.zpaq >> remote.zpaq
rm part.zpaq

indexfile 没有默认扩展名。但是,使用 .zpaq 扩展名可以列出它以显示远程归档的内容或与本地文件进行比较。它不能作为常规归档进行提取或更新。因此,以下命令应该产生相同的输出:

zpaqfranz l remote.zpaq
zpaqfranz l index.zpaq

如果 archive 是分卷的(包含 * 或 ?),zpaq 将替换为等于前一个更新数量加 1 的分卷号。然后可以像访问分卷归档一样访问这些分卷,而无需附加或重命名。

使用 add 时,如果要创建的归档已经存在,或者 indexfile 是常规归档,则会出错。-index 不能与 -until 或流式归档 -method s... 一起使用。使用 extract 时,如果 indexfile 存在且未使用 -force 覆盖,则会出错。

-noattributes

使用 add 时,不保存 Windows 属性或 Unix/Linux 权限到归档。

-not [file]...

不添加与任何指定文件同名的文件。file 可以包含通配符 *?,它们分别匹配任何字符串或字符,包括 /。匹配到目录也匹配其所有内容。在 Windows 中,匹配不区分大小写,并且 \ 匹配 /。在 Unix/Linux 中,带有通配符的参数必须用引号括起来,以保护它们不被 shell 展开。

-only file...

只添加与至少一个参数匹配的文件。匹配通配符的规则与 -not 相同。默认值为 *,匹配所有内容。

如果文件同时匹配 -only 和 -not 的参数,则 -not 优先。

-tN

-threads N

请注意 -tN 和 -threads N 之间的空格 并行添加最多 N 个块。默认值为 0,表示使用处理器核心数,但在 zpaqfranz 编译为 32 位代码时,不超过 2 个。选择较少的线程会减少内存使用但运行较慢。选择多于核心数的线程没有帮助。

-to name...

使用 add 时,将外部文件重命名为相应的内部名称。当 files 为空时,将提取的文件加上 names 中的第一个名称作为前缀,如果需要则插入 / 并移除驱动器号中的 :。例如:

zpaq add archive dir -to newdir

会将 dir/file 保存为 newdir/file,依此类推。

-only 和 -not 选项在重命名之前应用。

-until date | [-]version

忽略在 date 或 version 更新之后或从末尾向前数 -versions 更新之后添加到归档的任何部分。此外,add 将在此时截断归档,然后附加下一个更新。指定 date 时,更新将带有 date 的时间戳,而不是当前日期。

date 指定为 4 位年份(1900 到 2999)、2 位月份(01 到 12)、2 位日期(01 到 31)、可选的 2 位小时(00 到 23,默认 23)、可选的 2 位分钟(00 到 59,默认 59)以及可选的 2 位秒(00 到 59,默认 59)。日期和时间始终是通用时区 (UT),而不是本地时间。数字 up to 9999999 被解释为版本号而不是日期。日期可以包含空格和标点符号以提高可读性,但会被忽略。例如:

zpaq add backup files -until 2014/04/30 11:30

截断在世界时 2014 年 4 月 30 日 11:30:59 之后添加的任何数据,然后附加更新,就像这是当前时间一样(文件日期是否是将来日期无关紧要)。

zpaq add backup files -until 0

删除 backup.zpaq 并创建一个新归档。

add -until 在分卷归档或与索引一起使用时会出错。分卷归档可以通过删除编号最大的分卷来回滚。

使用 add -until 截断和附加加密归档(即使是 -until 0)不会更改盐或密钥流。因此,拥有旧版本和新版本的攻击者可以在没有密码的情况下获得尾部明文的 XOR 值。

-until 在 add 中相当危险。为了向后兼容而保留,但请改用新的 -timestamp

-timestamp X

设置版本日期时间为 X,例如 2021-12-30_01:03:04 以冻结 zfs 快照。必须单调递增 (v[i+1].date > v[i]+date)。

-find pippo

-replace pluto

将文件名中的字符串从“pippo”查找并替换为“pluto”,这对于“净化”文件名的头部很有用,便于在不同操作系统(例如 Linux vs Windows 等)中轻松检查、比较和提取。 作为 zpaqfranz 的一般规则,只考虑多个开关中的第一个:-find pippo -find pluto -find paperino 等同于 -find pippo

-xls

不强制添加 .XLS/.PPT(默认:否)

-715

运行起来基本像 7.15 版本。

-nochecksum

不获取校验和,像 7.15 版本一样(最快)

-crc32

为每个文件存储 CRC-32。

-xxhash

为每个文件存储 CRC-32 和 XXHASH64(默认)。

-xxh3

为每个文件存储 CRC-32 和 XXH3 (128 bit)(非常快)。

-checksum -sha1

为每个文件存储 CRC-32 和 SHA-1(慢)。

-sha256

为每个文件存储 CRC-32 和 SHA-256(最慢,最可靠)。

-blake3

为每个文件存储 CRC-32 和 BLAKE3(在英特尔 CPU 上比 SHA-256 快,非常可靠。在 Win 64 上有硬件加速)。

-md5

为每个文件存储 CRC-32 和 MD5(广泛使用,向后兼容)。

-sha3

为每个文件存储 CRC-32 和 SHA-3 (256 bit)(新的 NIST 标准),非常非常可靠。

-verify

在 add() 期间对 SHA-1 冲突进行早期检查,如果检测到则失败(减慢约 10%)。

-test

执行后添加测试(信任,但要验证)。

-vss

卷影复制(需要管理员权限的 Windows)以备份 %users% 中的文件。

-comment foo

添加一个带有 ASCII 文本“foo”的版本。

-noeta

不显示 ETA(减少脚本重定向的混乱)。

-verbose

详细输出。

-pakka

新式输出(按块)。

-debug

显示大量信息。

-summary

简洁输出。

-filelist

将要添加到 VFILE 的文件列表添加进去。

-forcezfs

强制不忽略 .zfs(通常是 FreeBSD 快照)。

-noqnap

强制不忽略 "@Recently-Snapshot" 和 "@Recycle"。

-forcewindows

强制不忽略 "System Volume Information" 和 "$RECYCLE.BIN" 以及 ADS (alternate data stream)。

-nopath

添加时不存储完整路径。

-nosort

添加之前不对文件排序。

-freeze outputfolder -maxsize something

虚拟机磁盘(例如 vmdk)的备份中期(数月)会变得很大,经典的方法是简单地将 .zpaq 文件重命名(/移动)到“某个地方”(通常是 NAS),这样下次运行时就会从头开始。 通常旧的归档不会立即删除(因为它包含了昨天、前天等的备份),而是“停放”在那里等待取消,比方说几个月或几年之后。 新开关会自动执行此操作,并且使用 n (purge) 命令,归档轮换变得相当容易。

-copy somefolder

将写入的数据制作一份副本到另一个文件夹(例如在两个不同的 NAS 上保存两份副本)。

-sfx nameofsfx.exe

在 Windows 32/64 上可以制作 SFX 归档。

zpaqfranz a z:\1.zpaq *.cpp -sfx z:\2.exe

带有一些选项,这些选项将成为提取 SFX 模块的一部分。

  • -sfxto foldr 在 SFX 模块中设置 -to
  • -sfxforce 在 SFX 模块中设置 -force
  • -sfxnot 类似 SFX 的 -not
  • -sfxonly 类似 SFX 的 -only
  • -sfxuntil 类似 SFX 的 -until
命令 autotest (编译源代码后进行自动测试以发现隐藏错误) zpaqfranz 可以在不同的系统上运行,有时是“奇特”的系统,比如非英特尔、ARM,甚至是大端序(BIG ENDIAN)系统。

确保新编译的可执行文件能够正常工作(至少在主要命令上)的一个好方法是运行自检。

CMD   autotest (autotest)
<>:             在当前系统上进行操作性自检
<>: -all        全面测试(所有哈希算法)
<>: -n X        在全面测试(-all)中使用 X 大小(最小:200.000,默认:1.000.000)
<>: -n X        在轻量测试(非 -all)中使用 X 个 ASCII 字符
<>: -verbose    详细输出
<>: -to d0      创建(到文件夹 d0 中)一个 dotest.sh/bat 脚本

示例:

最开始的测试是哈希算法

哈希内部测试 'ABCD'

zpaqfranz autotest
(...)
Quick check chunsize 5: ABCDE
This seems a LITTLE ENDIAN CPU (aka:'normal')
-----------------------------------------------------------------------------------------------------
CALC          BLAKE3: 61274278289E9F6233DF34ABB392AAFE03EE7CE9D77167F3A8D9CDE1AD9861C0
CALC          CRC-32: 72D31AD5
CALC         CRC-32C: B6AFE183
CALC      HIGHWAY128: C4C97D024A5DDDC7609B799BDBC46492
CALC      HIGHWAY256: 13F23C2D5C49147DB7B10C8D8923CB052C2B3E1FF3EED5681E4FD69F05FFA6FE
CALC       HIGHWAY64: 4755E237BAD15B4C
CALC           MD5: 2ECDDE3959051D913F61B14579EA136D
CALC    SHA-256-PUT: F0393FEBE8BAAA55E32F7BE2A7CC180BF34E52137D99E056C817A9C07B8F239A
CALC  SHA-256-WRITE: F0393FEBE8BAAA55E32F7BE2A7CC180BF34E52137D99E056C817A9C07B8F239A
CALC           SHA-3: 034AF02F68F8874B6668CCBEE49143A64BE435610E1282D93BF35FD80ACCE1FB
CALC        SHA1-PUT: 7BE07AAF460D593A323D0DB33DA05B64BFDCB3A5
CALC      SHA1-WRITE: 7BE07AAF460D593A323D0DB33DA05B64BFDCB3A5
CALC       WHIRLPOOL: C73D8F890F181CE6EB9FF431E08828D6BADA50AC2427546BA10A8F8226F527850FB61E638F798CE86028248262DF17D77D9D00FA5FE5E6CE6C94267E1DC2E99C
CALC            XXH3: 1C8288B6013152D97B4A5D7E6C7893D4
CALC        XXHASH64: E47599E7C7CEF609
CALC       XXHASH64Y: E47599E7C7CEF609
-----------------------------------------------------------------------------------------------------

注意:ABCD 是一个小的字符串,对于“奇特端序”的 CPU,一个更大的字符串会更好。

哈希内部测试 'ABCDEFGHIJ' (10 字节,大于 8)

zpaqfranz autotest -n 10
zpaqfranz v58.9d-JIT-GUI-L,HW SHA1/2,SFX64 v55.1,(2023-08-23)
franz:-n                                         10
franz:-hw
Self-test for correct internal functioning
Quick check chunsize 10: ABCDEFGHIJ
This seems a LITTLE ENDIAN CPU (aka:'normal')
-----------------------------------------------------------------------------------------------------
CALC          BLAKE3: A83D6456601B32E4302F696532AE882044F7EDED2B00F74159A0DDFD6A0A9DAA
CALC          CRC-32: 321E6D05
CALC         CRC-32C: D599AEFD
CALC      HIGHWAY128: E1BBF9D05BFB99EBD0336A9906F3CCE4
CALC      HIGHWAY256: B0EBEBDAF4ED2043B968F0D094325F475CD2F478D0DE57B97CCB10294AC99942
CALC       HIGHWAY64: 9579048C07CC2514
CALC           MD5: E86410FA2D6E2634FD8AC5F4B3AFE7F3
CALC    SHA-256-PUT: 261305762671A58CAE5B74990BCFC236C2336FB04A0FBAC626166D9491D2884C
CALC  SHA-256-WRITE: 261305762671A58CAE5B74990BCFC236C2336FB04A0FBAC626166D9491D2884C
CALC           SHA-3: 5B124C1AC15BBD082620143FFDC3BC84EED02BE0D0A84CAA276B6A4A8C565CB0
CALC        SHA1-PUT: 9F67EFC6AFA95F1AEF9B3351D6B01D7E0591B748
CALC      SHA1-WRITE: 9F67EFC6AFA95F1AEF9B3351D6B01D7E0591B748
CALC       WHIRLPOOL: B11F2BC6D12A027AF10E2B12BE5EB385FD6B94F94A8CB3BE260304C02D007D4D58BC3F369C30C455FDAF0C7CF1FFDB209AAEA893FDC81F6FB90F88356438B7EA
CALC            XXH3: 3FC2ABFB4543DAA0C1B965201991D9DB
CALC        XXHASH64: D6B92ADC10DC7FFE
CALC       XXHASH64Y: D6B92ADC10DC7FFE
-----------------------------------------------------------------------------------------------------

第二个测试是 -all

这里进行更繁重的处理,同样是为了截获在“奇特”CPU 上可能出现的任何哈希问题。对于慢速机器可能需要很长时间。

Z:\>zpaqfranz autotest -all
zpaqfranz v58.9d-JIT-GUI-L,HW SHA1/2,SFX64 v55.1,(2023-08-23)
franz:-all                                         4
franz:-hw
Self-test for correct internal functioning
Iteration 0/9 chunksize     1.000.000
Iteration 1/9 chunksize       333.333
Iteration 2/9 chunksize       111.111
Iteration 3/9 chunksize        37.037
Iteration 4/9 chunksize        12.345
Iteration 5/9 chunksize         4.115
Iteration 6/9 chunksize         1.371
Iteration 7/9 chunksize           457
Iteration 8/9 chunksize           152
Iteration 9/9 chunksize            50
This seems a LITTLE ENDIAN CPU (aka:'normal')
          BLAKE3 : OK
          CRC-32 : OK
         CRC-32C : OK
      HIGHWAY128 : OK
      HIGHWAY256 : OK
       HIGHWAY64 : OK
           MD5 : OK
    SHA-256-PUT : OK
  SHA-256-WRITE : OK
           SHA-3 : OK
        SHA1-PUT : OK
      SHA1-WRITE : OK
       WHIRLPOOL : OK
            XXH3 : OK
        XXHASH64 : OK
       XXHASH64Y : OK
Time 127.89 seconds for bytes 1.748.003.691

127.906 seconds (000:02:07) (all OK)

-verbose (或 -debug) 将显示大量 BTS(以防万一出错)

最后一个测试需要一些 (~4GB) 临时磁盘空间。确保没有满的驱动器!

*这将在 -to 文件夹内创建大量数据,以及一个需要“手动”启动的脚本。脚本将是 .BAT.sh (Win/nix) 对于慢速机器可能需要很长时间。

Z:\>zpaqfranz autotest -all -to z:\pippo
zpaqfranz v58.9d-JIT-GUI-L,HW SHA1/2,SFX64 v55.1,(2023-08-23)
franz:-all                                         4
franz:-hw
Self-test for correct internal functioning
Creating autotest folder in <<z:/pippo/>>
Iteration 0/9 chunksize     1.000.000
Iteration 1/9 chunksize       333.333
Iteration 2/9 chunksize       111.111
Iteration 3/9 chunksize        37.037
Iteration 4/9 chunksize        12.345
Iteration 5/9 chunksize         4.115
Iteration 6/9 chunksize         1.371
Iteration 7/9 chunksize           457
Iteration 8/9 chunksize           152
Iteration 9/9 chunksize            50
This seems a LITTLE ENDIAN CPU (aka:'normal')
          BLAKE3 : OK
          CRC-32 : OK
         CRC-32C : OK
      HIGHWAY128 : OK
      HIGHWAY256 : OK
       HIGHWAY64 : OK
           MD5 : OK
    SHA-256-PUT : OK
  SHA-256-WRITE : OK
           SHA-3 : OK
        SHA1-PUT : OK
      SHA1-WRITE : OK
       WHIRLPOOL : OK
            XXH3 : OK
        XXHASH64 : OK
       XXHASH64Y : OK
Time 134.78 seconds for bytes 1.748.003.691


The test batchfile is: z:\pippo\dotest.bat

134.796 seconds (000:02:14) (all OK)

现在启动批处理/脚本文件

请耐心等待,您将获得 4 个“停止点”

Z:\>z:\pippo\dotest.bat
Impossibile trovare z:\pippo\testme.zpaq
zpaqfranz v58.9d-JIT-GUI-L,HW SHA1/2,SFX64 v55.1,(2023-08-23)
franz:-hw
z:/pippo/sha256.zpaq:
1 versions, 256 files, 158.239 bytes (154.53 KB)
Extract 9.472.000 bytes (9.03 MB) in 256 files (0 folders) / 32 T
         94.14% 00:00:00  (  8.50 MB)=>(  9.03 MB)  580.53 KB/sec

15.563 seconds (000:00:15) (all OK)
zpaqfranz v58.9d-JIT-GUI-L,HW SHA1/2,SFX64 v55.1,(2023-08-23)
franz:sum                                          1 - command
franz:-sha256 -force -hw -rename
Getting SHA-256 ignoring .zfs and :$DATA

No multithread: Found (9.03 MB) => 9.472.000 bytes (9.03 MB) / 256 files in 0.000000
Renamed     files  0
NOT renamed files  256

0.062 seconds (00:00:00) (all OK)
(1) You should read NOT renamed files  256


**** Hit a key to continue ****

看 (1)

(...)
zpaqfranz v58.9d-JIT-GUI-L,HW SHA1/2,SFX64 v55.1,(2023-08-23)
franz:sum                                          1 - command
franz:-sha256 -hw
Getting SHA-256 ignoring .zfs and :$DATA

No multithread: Found (976.56 KB) => 1.000.000 bytes (976.56 KB) / 1 files in 0.016000
|SHA-256: 67708591460BCE3BC45AE086A342F9F390AD2913A22639EC7AF3646B7D2AEA78 [      1.000.000]     |z:/pippo/verifica

0.047 seconds (00:00:00) (all OK)
(2) You should read SHA-256: 67708591460BCE3BC45AE086A342F9F390AD2913A22639EC7AF3646B7D2AEA78


**** Hit a key to continue ****

看 (2)

(...)
SUMMARY :        40.92 (total time)
Virtual :           10 (skipped, does not exists in 7.15)
Total   :        42.727
GOOD    :        42.727 of      42.727 (stored=decompressed)
SURE    :        42.727 of      42.727 (stored=decompressed=file on disk)
All OK (paranoid test with check against filesystem)

41.000 seconds (000:00:41) (all OK)
(3) You should read SURE    :        42.727 of      42.727 (stored=decompressed=file on disk)

看 (3)

(...)
No multithread: Found (926.02 MB) => 971.003.691 bytes (926.02 MB) / 41.958 files in 1.063000
Scanning filesystem time            1.063 s
Data transfer+CPU   time            2.251 s
Data output         time            0.062 s
Total size                        971.003.691 ( 926.02 MB)
Tested size                       971.003.691 ( 926.02 MB)
Duplicated size                   843.011.115 ( 803.96 MB)
Duplicated files                       39.654
Worked on 971.003.691 bytes avg speed (hashtime) 431.365.478 B/s
GLOBAL SHA256: 7B32DB3F6F0180062773C5A046A2C99D17BE7668202379BA136E7A4D134FFC26

3.438 seconds (000:00:03) (all OK)
(4) You should read GLOBAL SHA256: 7B32DB3F6F0180062773C5A046A2C99D17BE7668202379BA136E7A4D134FFC26

最后看 (4)

现在您可以安全地删除临时文件夹了

几乎所有项目都应该是“OK”,errors=0 等。

这个自检 100% 可靠吗?当然不是。zpaqfranz 内部有太多函数无法进行全面测试,但这是一种初步评估的好方法。

命令 b (CPU 基准测试,速度指数单位是 (没错!) franzomips) 这是一个快速且简陋的 CPU 基准测试。 结果没有科学上的可靠性。 它用于估算机器的计算性能,例如 VPS 或远程服务器。 也用于(非常粗略地)估算多线程能力(对于 VPS,可能有未知数量的虚拟核心)。 会显示一个合成的单线程指数 (franzomips),绝对意义上它显然完全无用,只有相对意义上的价值。

它还可以用来确定硬件加速是否启用,即 zpaqfranz(使用 -DHWSHA2- 编译)是否认为 CPU 能够执行 SHA1 和 SHA256 的加速代码。

Z:\>zpaqfranz b -debug
(...)
zpaqfranz v58.9d-JIT-GUI-L,HW SHA1/2,SFX64 v55.1,(2023-08-23)
FULL exename <<c:/zpaqfranz/zpaqfranz.exe>>
42993: The chosen algo 3 SHA-1
1838: new ecx 2130194955
1843: new ebx 563910569
SSSE3 :OK
SSE41 :OK
SHA   :OK
franz:-debug -hw -verbose
uname WIN64
full exename seems <<c:/zpaqfranz/zpaqfranz.exe>>
Hello Windows
Free RAM seems 41.370.468.352
1838: new ecx 2130194955
1843: new ebx 563910569
SSSE3 :OK
SSE41 :OK
SHA   :OK
SHA1/2 seems supported by CPU

这是 Win64 上的一个示例,大约有 40GB 可用内存,并且启用了 SHA 加速。

-all 用于某种 CPU 压力测试/烤机。-n X 运行 X 秒。

一些示例:

Benchmark all:                      b
Multithread:                        b -all
Benchmark all on 1.86GB:            b -minsize 2000000000
Benchmark all on 1MB:               b -minsize 1048576
Benchmark SHA256 and BLAKE3:        b -sha256 -blake 3 -minsize 1048576
Benchmark for 10 second each:       b -n 10 -sha256 -blake3 -minsize 1048576
Cook the CPU (all cores):           b -all -n 20 -blake3
Cook the CPU (8 cores):             b -all -t8 -n 20 -blake3
命令 backup (使用强化多部分进行备份)

正如大家所知(或者可能不知),我对 zpaq 的第一个贡献是多卷归档的一个基本实现,后来由 Mahoney(以他一贯的高超技艺)合并了。

然而不幸的是,zpaq 更像一个归档器而不是一个备份系统:没有现实的方法来检查多卷归档的完整性,zpaq 对以下情况处理得不是很好:

  • 零长度:如果在压缩期间按下 Control-C,可能会生成一个长度为 0 字节的 pippo_00000XX.zpaq
  • “空洞”(缺少“片段”,例如 pippo001, pippo002, pippo007, pippo008...)
  • 混合不同的备份。你可以用另一个片段替换 zpaq 多卷归档的一个片段,zpaq 会很高兴地接受它,而不会注意到错误 (!)。由于每个会话都是“自给自足”的,zpaq 不仅不会警告用户,而且在加密的情况下(即使用 -key)会发生令人不快的事情。
  • 无法真正(快速)检查归档是否缺少部分:如果丢失了一个“片段”,则从该版本到最后一个版本的所有内容也可能丢失。更重要的是,如果你持有来自第三方客户端的数据,为了测试加密的归档,你需要密码,而你根本没有密码。而且 99.9% 的备份都是加密的,即使是在连接到局域网的 NAS 上的备份也是如此。
  • 速度。如果你有一个 10.000 个“片段”的备份,分割成 10.000 个“块”,用 zpaq 你真的无法判断所有东西是否正常,除非你运行一个(耗时的)全面测试,这可能需要几个小时(例如虚拟机磁盘)。

在某些关键情况下,你希望在不允许 rsync 的 --append 操作的系统上进行云备份(好吧,rclone 和 robocopy,我说的是你们)。

同样地,在廉价的 VPS 云系统上计算哈希值是很困难的,这些系统的磁盘通常非常慢,对于大小在约 50GB 左右的数据 already 如此。

这个新版本创建了一个基于文本的索引文件,该文件保留了多卷的列表、它们的大小、它们的 MD5 和它们的快速哈希值。

使用 zpaqfranz 进行多卷备份

zpaqfranz backup z:\prova.zpaq *.cpp

将自动创建:

  • 从 prova_00000001.zpaq, prova_00000002.zpaq, prova_00000001.zpaq... 开始的多卷归档
  • 一个文本索引文件 prova_00000000_backup.txt
  • 一个二进制索引文件 prova_00000000_backup.index

现在可以使用 testbackup 命令进行测试

这是一剂万灵药吗?

当然不是。 就我个人而言,我根本不喜欢将备份分割成许多不同的部分,丢失、损坏或损坏其中一个的风险很高。 然而,在某些情况下,别无选择。我不提一个最著名的互联网服务提供商的名字,以免宣传(毕竟...他们没付我钱 😃)。

a 还是 backup 更好?

我两者都用。 我正在考虑带纠错功能的多卷进化版本(不是检测,是纠正),但优先级不高。

为什么是古老的 MD5?

现在 zpaqfranz 用 XXH3 来进行这种检测(-checktxt)。 但是,有时你必须在“常用”的哈希算法中选择最快的那个(剧透:一些廉价的云供应商)。 使用 -backupxxh3 来代替使用 XXH3。

命令 c (比较一个主目录与一个或多个从目录) 比较一个“主”目录 (d0) 与 N 个“从”目录 (d1, d2, dN)。 [示例](https://github.com/fcorbelli/zpaqfranz/wiki/Examples:-compare) 在专业的归档领域,通常会将一个源(主)目录通过不同的机制复制到多个目标(从)目录(众所周知,目录对于 \*nix 系统具有普遍意义)。 通常,其中一些文件夹将是 (\*nix) NFS 或 SMB 挂载点,您可以使用 rsync、zfs-replica、robocopy (Windows) 等工具进行复制。 或者,在使用 zpaqfranz、7z 或 rar 的情况下,将完整的备份提取到临时文件夹中。 您如何确定所有主文件都存在于从目录中,并且从目录中的文件不比主目录多? 尤其是在使用 utf8 名称(非拉丁字符,在 UNIX-zfs 和 Linux-ext4 之间通常不兼容)以及路径长度 > 260(对于 NTFS)的情况下? 如果您的路径中包含某些 zfs 快照怎么办?

通常通过 rsync 或 robocopy 的 dry-run 或者通过... zpaqfranz 来实现。

在没有其他选项的情况下,检查是针对文件名和大小进行的,而不是内容,主要设计用于 NAS 和类似设备上的复制(快速,但不 100% 确定)。

开关

-all

将创建并发线程,每个线程扫描一个从目录(使用 -t K 限制数量)。 不适合单个机械硬盘,适合在不同介质上的多个从目录。

-checksum

进行“硬”检查(默认 SHA-1),比较哈希值而不是只比较文件大小。

-xxhash -sha256 -crc32 -crc32c -sha1

使用不同的校验和算法进行“硬”检查。 不同的校验和

-maxsize X

根据文件大小过滤。

-minsize X

根据文件大小过滤。

-715

像 7.15 一样工作(包含 .zfs 和 ADS)。

-flagforcezfs

包含 .zfs。

命令 consolidatebackup (合并多部分备份) 将多卷备份合并(对于多卷归档,请查看 m (merge) 命令)。 当备份包含大量文件(数千个)时,将其合并到**一个**文件中会更容易。 因此,新的添加将是第二个、第三个等等。

我们从一个包含两个块的备份开始:prova_00000001 和 prova_00000002。

C:\zpaqfranz>dir z:\prova*.*
 Volume in drive Z is RamDisk
 Volume Serial Number is 2CF8-748D

 Directory of z:\

02/09/2023  16:07       1.296.980 prova_00000000_backup.index
02/09/2023  16:07             275 prova_00000000_backup.txt
02/09/2023  16:07     443.397.076 prova_00000001.zpaq
02/09/2023  16:07     735.112.448 prova_00000002.zpaq
               4 File  1,179,806,779 bytes
               0 Dir  80,344,887,296 bytes free

现在将所有内容放入一个新的备份“z:\consolidated”中。

C:\zpaqfranz>zpaqfranz consolidatebackup z:\prova -to z:\consolidated
(...)
-----------------------------------------------------------------------------------------------------
z:/consolidated_????????.zpaq:
2 vers, 6.080 files, 35.881 frags, 217 blks, 1.178.509.524 bytes (1.10 GB)
Long filenames (>255)           1 *** WARNING *** (suggest -longpath or -fix255 or -flat)

85135: dtsize                     6.080 [i]                 6.080 [c]:OK
85135: usize              3.246.456.391 [i]         3.246.456.391 [c]:OK
85135: allsize            3.246.456.391 [i]         3.246.456.391 [c]:OK
85135: compressed         1.178.509.524 [i]         1.178.509.524 [c]:OK

3.438 seconds (000:00:03) (all OK)

现在:

C:\zpaqfranz>dir z:\consolidated*
 Volume in drive Z is RamDisk
 Volume Serial Number is 2CF8-748D

 Directory of z:\

02/09/2023  16:13       1.296.980 consolidated_00000000_backup.index
02/09/2023  16:13             186 consolidated_00000000_backup.txt
02/09/2023  16:13     1.178.509.524 consolidated_00000001.zpaq
               3 File  1,179,806,690 bytes
               0 Dir  79,165,075,456 bytes free

您可以将一个标准的 .zpaq 文件转换为备份格式。

让我们创建一个“正常”的 zpaq 文件。

C:\zpaqfranz>zpaqfranz a z:\normalarchive.zpaq *.cpp
zpaqfranz v58.10a-JIT-GUI-L,HW BLAKE3,SHA1/2,SFX64 v55.1,(2023-08-25)
franz:-hw
Creating z:/normalarchive.zpaq at offset 0 + 0
Add 2023-09-02 16:15:33         27         88,671,790 (  84.56 MB) 32T (0 dirs)
27 +added, 0 -removed.

0 + (88.671.790 -> 21.127.715 -> 2.338.016) = 2.338.016 @ 146.30 MB/s

0.593 seconds (00:00:00) (all OK)

现在将“normalarchive”转换为“backuparchive”。

C:\zpaqfranz>zpaqfranz consolidatebackup z:\normalarchive -to z:\backuparchive
zpaqfranz v58.10a-JIT-GUI-L,HW BLAKE3,SHA1/2,SFX64 v55.1,(2023-08-25)
franz:consolidatebackup                                 Y - command
franz:-hw
(...)
z:/backuparchive_????????.zpaq:
1 vers, 27 files, 262 frags, 4 blks, 2.338.016 bytes (2.23 MB)

85135: dtsize                         27 [i]                     27 [c]:OK
85135: usize                  88.671.790 [i]             88.671.790 [c]:OK
85135: allsize                88.671.790 [i]             88.671.790 [c]:OK
85135: compressed              2.338.016 [i]              2.338.016 [c]:OK

0.063 seconds (00:00:00) (all OK)

就是这样

C:\zpaqfranz>dir z:\backuparchive*
 Volume in drive Z is RamDisk
 Volume Serial Number is 2CF8-748D

 Directory of z:\

02/09/2023  16:16           9.243 backuparchive_00000000_backup.index
02/09/2023  16:16             188 backuparchive_00000000_backup.txt
02/09/2023  16:16         2.338.016 backuparchive_00000001.zpaq
               3 File    2,347,447 bytes
               0 Dir  79,160,385,536 bytes free
命令 cp (友好的文件复制,带剩余时间估计(可恢复)) 将文件(带通配符)复制到 -to 文件夹中,并带有 1 秒的进度反馈。适用于处理大文件、窄带宽和不可靠介质(-verify)。默认情况下会覆盖,使用 -paranoid 创建唯一名称。

主要用途是提供进度反馈,确保程序没有卡住。

次要用途,在使用 .zpaq 文件时极其重要,是能够使用 -append,就像 rsync 的 --append 开关一样。在 samba NAS 上更新 zpaq 文件基本上是直接的。

这使得复制过程可恢复,例如在连接中断、按下 control-c 或其他情况下。

一些实际用法

  • -verify 对复制的数据进行严格(XXH3)检查
  • -paranoid 重命名输出文件以避免覆盖
  • -append 仅附加数据(*有风险,用于 zpaq 归档)
  • -force 不检查目标是否可写
  • -space 不检查目标是否有足够的可用空间

示例:

Copy k:\*.mp4 d:\a.txt in z:\pluto     cp k:\*.mp4 d:\a.txt -to z:\pluto
Copy with verify                      cp k:\*.mp4 -to z:\pluto -verify
Copy WITHOUT overwrite                cp k:\*.mp4 -to z:\pluto -paranoid
Resumable copy (append only)          cp k:\*.zpaq -to z:\pluto -append
命令 d(毫不留情地删除单个文件夹中的重复文件) 将文件夹去重,期间不会有任何询问(您无法选择删除什么)。

检查文件夹中的重复文件

zpaqfranz d z:\thefolder\

默认情况下运行 dry-run(模拟运行)。

显示文件夹中的重复文件

zpaqfranz d z:\thefolder\ -verbose

无情地去重!

zpaqfranz d z:\thefolder\ -force

执行“wet run”(实际运行),并带有验证码以确保安全...

使用 SHA-256 而不是 XXH3 显示重复文件

zpaqfranz d z:\thefolder\ -sha256 -verbose
命令 dir (一个更好的 dir (是的,Windows 的 dir))

在 *nix 系统上,ls 命令真的、真的很难用。 不像 Windows 的 dir 命令那样,没有简单的方法可以获取文件的递归列表、它们的总大小,甚至可能还有可用空间。 在 Windows 上,子文件夹的输出很混乱,并且没有简单的方法进行 |tail 操作。

CMD   dir (没错,就是 Windows 里的 dir,甚至更好)。
+ :             我真的讨厌 ls:它不显示累计文件大小(!)
                Windows 的 dir 命令的“迷你克隆”,带主要开关
+ : /s          递归(注意:Win 风格的开关必须在“普通”开关之前)
+ : /os         按大小排序
+ : /a          显示所有(隐藏)文件
+ : -checksum   显示每个文件的哈希值
+ : -(somehash) 使用 (somehash) 查找重复/显示校验和
+ : -nochecksum -crc32 -xxhash -sha1 -sha256 -xxh3 -blake3 -sha3 -md5 -windate -whirlpool
l -highway64 -highway128 -highway256
+ : -crc32c -wyhash -nilsimsa -entropy -quick
+ : -n X        类似于 |tail -X
+ : -maxsize  X 按文件大小过滤。使用 K, M, G, T 和 KB,MB,GB,TB
+ : -minsize  Y 例如:3000000, 3.000.000, 3000K, 3.2KB, 3M, 3MB, 2G, 3GB, 2TB, 3T

示例:

Windows-dir 命令克隆:                  dir /root/script /od
显示 c:\ 中 10 个最大的 .mp4 文件:      dir c:\ /s /os -n 10 -find .mp4
在 C:\ 中查找重复的 .mp4 文件:          dir c:\ /s -crc32 -find .mp4
c:\z 及其子目录有多大?:                dir c:\z /s -n 1
c:\z 中 100 个最大的重复文件?:         dir c:\z /s -crc32 -n 100
显示 -md5 校验和,按大小递归:           dir z:\cb /s /os -checksum -md5
类似于 dir:                            dir z:\cb\*.avi
比 dir 更好:                           dir c:\*.cpp /s /os -n 100
命令 dirsize (显示累积文件夹大小)

快速计算 zpaq 归档中文件夹的大小是相当麻烦的,这里是相关的命令 dirsize。

“mamma” 和 “prenofat” 文件夹有多大?

C:\zpaqfranz>zpaqfranz dirsize j:\droppa.zpaq mamma prenofat
zpaqfranz v58.10a-JIT-GUI-L,HW BLAKE3,SHA1/2,SFX64 v55.1,(2023-08-25)
franz:-hw


31038: case iNSeNsITIVE right search, because NO -force switch


      674.711.101 [2023-05-20 11:15:47] <<c:/dropbox/Dropbox/mamma/>>
      188.690.257 [2023-08-25 11:17:03] <<c:/dropbox/Dropbox/franco/prenofat/>>

0.125 seconds (00:00:00) (all OK)
命令 e (在当前文件夹中提取文件)

在 zpaq 中,提取操作第一次使用时不是很容易理解。这里的 e 命令将所有内容提取到“这里”,也就是当前文件夹。在 Windows 上使用 -longpath 来支持大于 255 字符的文件名。

将所有内容提取到“这里”

zpaqfranz e z:\1.zpaq -longpath
命令 f (释放磁盘空间填充 (=可靠性测试) 或擦除 (隐私))

此命令将填充或擦除 99% 的可用磁盘空间,分块大小为 500MB。

检查磁盘控制器、系统、内存、缓存、线缆是否正常工作。

注意:这会磨损廉价的 SSD/U 盘。

  • : -verbose 显示写入速度(用于检查速度一致性)
  • : -force 不删除(运行后)临时文件名。默认会删除
  • : -zero 用零填充而不是随机数据。用于准备精简 VMDK 压缩
  • : -verify 对于 -zero:进行验证。 示例:

用伪随机文件填充(擦除)几乎所有可用空间

zpaqfranz f z:\

填充(擦除)并保留临时文件(您需要自己删除)

zpaqfranz f z:\ -force -verbose

用零填充可用空间(适用于 VM 压缩或扇区级镜像)

zpaqfranz f z:\ -zero

用零填充可用空间(带验证)

zpaqfranz f z:\ -zero -verify
命令 find (使用通配符搜索文件)

在 Linux 上按文件名搜索相对困难,或者说不方便。 除了将 find 重定向到 grep 等命令之外,没有专门用于查找文件的命令。

在 Windows 上,子文件夹搜索的输出很尴尬,例如:

dir c:\zpaqfranz\zpaqfranz.cpp /s
(...)
 Volume in drive C has no label.
 Volume Serial Number is 1234-5678

 Directory of c:\zpaqfranz

02/09/2023  16:35         3,337,783 zpaqfranz.cpp
               1 File           3,337,783 bytes

 Directory of c:\zpaqfranz\bsd\candidato\caricasito

09/08/2022  18:25         1,093,847 zpaqfranz.cpp
               1 File           1,093,847 bytes

 Directory of c:\zpaqfranz\ncurses

28/03/2023  21:35         4,922,480 zpaqfranz.cpp
               1 File           4,922,480 bytes

 Directory of c:\zpaqfranz\ncurses\ok4

14/03/2023  17:09         4,411,567 zpaqfranz.cpp
               1 File           4,411,567 bytes

别担心,zpaqfranz 来帮忙了!

C:\zpaqfranz>zpaqfranz find c:\zpaqfranz -only *zpaqfranz.cpp
zpaqfranz v58.10a-JIT-GUI-L,HW BLAKE3,SHA1/2,SFX64 v55.1,(2023-08-25)
franz:find                                         j - command
franz:-only                             *zpaqfranz.cpp
--------------------------------------------------------------------------------------
franz:-hw
c:/zpaqfranz/bsd/candidato/caricasito/zpaqfranz.cpp          1.093.847)
c:/zpaqfranz/ncurses/ok4/zpaqfranz.cpp
(...)
c:/zpaqfranz/release/54_10/zpaqfranz.cpp
c:/zpaqfranz/release/54_11/zpaqfranz.cpp
c:/zpaqfranz/release/54_12/zpaqfranz.cpp
c:/zpaqfranz/release/54_12j/zpaqfranz.cpp
(...)
c:/zpaqfranz/release/58_9/zpaqfranz.cpp
c:/zpaqfranz/release/bsd/caricasito/zpaqfranz.cpp
c:/zpaqfranz/release/bsd55_9/zpaqfranz.cpp
c:/zpaqfranz/release/exe/zpaqfranz.cpp
c:/zpaqfranz/release/fedora/zpaqfranz/ugo/zpaqfranz.cpp
c:/zpaqfranz/release/proxmox/zpaqfranz.cpp
c:/zpaqfranz/release/zpaqfranz.cpp
c:/zpaqfranz/trail/zpaqfranz.cpp
c:/zpaqfranz/zpaqfranz.cpp
======================================================================================
Files 55 for 162,523,555 bytes (154.99 MB)

0.062 seconds (00:00:00) (all OK)
命令 fzf (“纯粹而简单”地列出归档文件名)

fzf 是一个用于某种“TUI”(文本用户界面)的常用控制台工具

这个命令适用于 fzf 用户,使用 -all 可以列出所有版本的文件名

列出文件名

zpaqfranz fzf z:\kajo.zpaq

列出文件名并管道到 fzf

zpaqfranz fzf z:\kajo.zpaq|fzf
命令 g (在没有管理员权限的 shell 中运行的 Windows C 盘归档器) 1
命令 gui (Windows 文本界面的 GUI (列出-提取)) 1
命令 i (文件 (归档) 信息) To be updated
命令 isopen (检查文件是否被其他软件打开) 1
命令 k (杀死 (删除) 所有不在归档中的内容 (有风险!)) 1
命令 l (列出文件)

两种操作模式 与 ZPAQ 略有不同:不再存在 -not = voodoo

示例 与 7.15 的差异

只有一个参数 (.zpaq) => 列出内容

zpaqfranz l z:\1.zpaq

可选的文件夹 => 比较 .zpaq 内容与磁盘上的文件

_zpaqfranz l z:\1.zpaq c:\nz_ 与可选文件夹一起使用时,比较指定的文件和目录与磁盘上的同名文件(验证)。对于每个文件或目录,显示比较结果、最后修改日期、未压缩大小、Windows 属性或 Unix/Linux 权限以及保存的名称。如果文件的内部和外部版本不同,则同时显示两者。 比较结果在第一列报告:如果最后修改日期、属性(如果已保存)和大小都相同,则为 =;如果不同,则为 #;如果外部文件不存在,则为 -;如果内部文件不存在,则为 +。使用 -force 时,比较内容,但不比较日期或属性。内容通过读取文件、计算 SHA-1 哈希值并与存储的哈希值进行比较来完成。在任何一种情况下,将 list 替换为 add 将准确显示将对归档进行的更改。

属性

在 Unix/Linux 中,权限列为文件类型,d 表示目录,空白表示普通文件,后跟 chmod(1) 定义的 4 位八进制数。在 Windows 中,属性如下:只读、隐藏、系统、未使用(空白)、目录、存档、设备、普通文件、临时、稀疏文件、重解析点、压缩、离线、未索引内容、加密、完整性流、虚拟、无擦除数据。

开关

-all [N]

列出所有已保存的版本,而不仅仅是最新版本,包括标记为已删除的版本。每个版本显示在一个单独的编号目录中,从 0001| 开始。绝对路径首先转换为相对路径。在 Windows 中,移除驱动器号上的 :。例如,foo 和 /foo 显示为 0001/foo。C:/foo 和 C:foo 显示为 0001|C/foo。 每个版本的根目录上显示的日期是更新日期。根目录列表还显示该版本中的更新和删除数量以及压缩后的大小。 文件被删除时,日期和属性为空白,大小为 0。 N 选择目录名中的位数。默认值为 4。

-n X -limit X

按大小降序排序,显示前 X 个结果。

-minsize X -maxsize X

按最小或最大大小(字节)过滤。

-find foo

过滤(不区分大小写),类似于 |grep -i foo。

-replace pluto

与 -find pippo 一起使用 => 将 pippo 替换为 pluto。

-checksum

显示 CRC-32/SHA-1/XXH3(如果存在)。

-summary

用于 CRC-32/哈希的更紧凑输出。

-key password

此选项对于所有操作加密归档的命令都是必需的。

-not [file]...

不列出与任何指定文件同名的文件。file 可以包含通配符 * 和 ?,它们分别匹配任何字符串或字符,包括 /。匹配到目录也匹配其所有内容。在 Windows 中,匹配不区分大小写,并且 \ 匹配 /。在 Unix/Linux 中,带有通配符的参数必须用引号括起来,以保护它们不被 shell 展开。

-only file...

只列出与至少一个参数匹配的文件。匹配通配符的规则与 -not 相同。默认值为 *,匹配所有内容。 如果文件同时匹配 -only 和 -not 的参数,则 -not 优先。

-until date | [-]version

按版本(甚至负数)或按日期列出。

日期指定为 4 位年份(1900 到 2999)、2 位月份(01 到 12)、2 位日期(01 到 31)、可选的 2 位小时(00 到 23,默认 23)、可选的 2 位分钟(00 到 59,默认 59)以及可选的 2 位秒(00 到 59,默认 59)。日期和时间始终是通用时区 (UT),而不是本地时间。数字 up to 9999999 被解释为版本号而不是日期。日期可以包含空格和标点符号以提高可读性,但会被忽略。

-comment foo

如果可能,列出版本 foo。

命令 last (获取最后一个多卷文件名) 1
命令 last2 (比较最后两行) 1
命令 m (合并 (整合) 多卷归档到一个文件) To be updated
命令 n (抽取 (保留较新的 X 个) 旧文件) To be updated
命令 p (偏执测试 (慢, 需要大量 RAM)) 好的,这是对该命令的翻译:

以非常偏执的方式测试归档内容。 使用 ZPAQ 参考解压器将各种块提取到 RAM 中并进行检查。 换句话说,不使用 7.15 算法进行解压,而是使用 unzpaq206 的算法,以避免“静默”错误的风险。 本质上它类似于将整个归档提取到临时文件夹中。 RAM 的使用量会很快变得难以管理。 不支持像 ????. 这样的多文件。 操作期间会显示 RAM 使用量的估计值(不是很精确)。 对于每个文件,将输出虚拟提取的文件内容的 SHA-1 值。 通常与 add() -checksum 结合使用进行比较,add() -checksum 会存储 SHA-1 代码。 在 Win32 系统上(有 RAM 限制)会发出警告,并且拒绝在 ESXi 上运行。

-noeta

没什么好说的。

-verbose

显示匹配项(实际上是所有内容)。默认只显示错误。

-verify

下一级的偏执:将哈希值与从文件系统重新读取的内容进行检查。 换句话说,您将获得以下检查: 解压后 == 存储在归档中 从文件系统再次读取 == 存储在归档中

没错,还有一个等级正在开发中...😃

命令 password (更改/移除单一归档文件的密码 (非多卷)) 1
命令 pause (暂停脚本执行直到指定时间或按键) 1
命令 q (带 VSS 的 Windows C 盘归档) 1
命令 r (Robocopy 一个主目录到多个从属目录) To be updated
命令 rd (移除 Windows 下难以删除的文件夹 (例如路径过长)) 1
命令 rsync (删除 rsync 遗留的临时文件) 一个清除 rsync 临时文件的特殊功能
命令 s (获取目录大小,返回可用磁盘空间) To be updated
命令 sfx (Windows 创建 SFX 模块 (支持加密)) 1
命令 sum (计算哈希校验和,查找重复文件) To be updated
命令 t (测试存档完整性)

以非常偏执的方式测试归档内容。 使用 ZPAQ 参考解压器提取 RAM 中的各种块并进行检查。 换句话说,不使用 7.15 算法进行解压,而是使用 unzpaq206 的算法,以避免“静默”错误的风险。 本质上它类似于将整个归档提取到临时文件夹中。 RAM 的使用量会很快变得难以管理。 不支持像 ????. 这样的多文件。 操作期间会显示 RAM 使用量的估计值(不是很精确)。 对于每个文件,将输出虚拟提取的文件内容的 SHA-1 值。 通常与 add() -checksum 结合使用进行比较,add() -checksum 会存储 SHA-1 代码。 在 Win32 系统上(有 RAM 限制)会发出警告,并且拒绝在 ESXi 上运行。

示例

开关

-all

检查所有版本。

-verify

执行文件系统后检查:检查 STORED CRC 是否与解压后的 CRC 相同,并与从文件系统重新读取的原始文件进行检查,另外对 XXH3 进行双重检查(如果存在)。 无法使用标准的 7.15 归档进行此扩展检查。

-paranoid

使用新的 -paranoid 开关,现在可以将所有文件提取到临时目录中,检查哈希值,然后删除所有匹配的文件。 所有文件将以“纯粹”(无子目录)的无冲突命名约定提取(=> 可以在 Windows 上测试 *nix 文件),然后检查所有文件,如果正常则删除。 -verbose 显示差异(否则只打印摘要)。 总结: 如果在偏执验证后目标文件夹是空的,则表示所有文件都相同。如果还有文件剩余,则它们与预期不同。

没错,还有一个等级正在开发中...😃

命令 testbackup (多卷加固) 1
命令 trim (从不完整的事务中修剪 .zpaq 归档) 1
命令 utf (转换文件名到拉丁字符,修复过长的文件名等) To be updated
命令 v (验证归档 (与文件系统对照)) To be updated
命令 versum (类似 Hashdeep 的哈希双重检查) 1
命令 w (超大文件的分块提取测试) 1
命令 x (提取文件)

提取文件(包括目录内容),如果省略 files 则提取整个归档内容。 示例 与 7.15 的差异

强烈建议阅读:如何在 zpaq(franz) 中选择文件

文件名、最后修改日期和权限或属性会按归档中保存的方式恢复。如果同一文件存储了多个版本,则(默认情况下)只提取最新版本。如果存储的文件被标记为已删除,则不会提取。现有文件会被跳过,不会被覆盖。(使用 -force 强制覆盖)。

提取文件时,会计算片段的 SHA-1 哈希值并与存储的哈希值进行比较。如果出现不匹配,程序会报告错误。块只解压到最后使用的片段。如果归档损坏,zpaqfranz 会从未损坏的块中尽可能多地提取。

提取文件时,如果文件因为已存在而被跳过,程序会报告 ?;如果使用 -force 跳过解压(因为内容已经比较并发现相同),程序会报告 =。在这种情况下,日期和属性仍然会被提取。

警告:对于多卷归档请使用双引号,例如 "z:\thisismybackup-?????"

开关

-all [N]

提取所有已保存的版本,而不仅仅是最新版本,包括标记为已删除的版本。每个版本显示在一个单独的编号目录中,从 0001/ 开始。绝对路径首先转换为相对路径。在 Windows 中,移除驱动器号上的 :。例如,foo 和 /foo 显示为 0001/foo。C:/foo 和 C:foo 显示为 0001/C/foo。 每个版本的根目录上显示的日期是更新日期。根目录列表还显示该版本中的更新和删除数量以及压缩后的大小。 文件被删除时,日期和属性为空白,大小为 0。 N 选择目录名中的位数。默认值为 4。

-f -force

使用 extract 时,覆盖现有的输出文件。如果内容不同(通过比较 SHA-1 哈希值测试),则解压并提取文件。如果日期或属性/权限不同,则将其设置为与归档中存储的一致。

-key password

此选项对于所有操作加密归档的命令都是必需的。

-to name...

可能是 extract 命令最重要的开关 将内部文件名重命名为外部名称。当 files 为空时,将提取的文件加上 names 中的第一个名称作为前缀,如果需要则插入 / 并移除驱动器号中的 :。 不使用 -to 进行提取会写在原始文件的同一位置(请注意完整/部分路径)。 例如,对于以下归档:

    zpaqfranz a z:\1.zpaq c:\nz\

如果您运行

    zpaqfranz x z:\1.zpaq

文件将被写入 c:\nz\(因为使用了完整路径)

如果想提取到例如 y:\restored\c\nz\

    zpaqfranz x z:\1.zpaq -to y:\restored\

要恢复到 k:\extracted\copy2\nz\

    zpaqfranz x z:\1.zpaq  c:\nz\ -to k:\extracted\copy2\nz\

*请注意末尾匹配的 \ * 是的,这是 zpaqfranz 一个相当奇怪的行为,但习惯后会非常强大。

-only 和 -not 选项在重命名之前应用。

-until date | [-]version

忽略在 date 或 version 更新之后,或从末尾向前数 -versions 更新之后添加到归档的任何部分。 日期指定为 4 位年份(1900 到 2999)、2 位月份(01 到 12)、2 位日期(01 到 31)、可选的 2 位小时(00 到 23,默认 23)、可选的 2 位分钟(00 到 59,默认 59)以及可选的 2 位秒(00 到 59,默认 59)。日期和时间始终是通用时区 (UT),而不是本地时间。数字 up to 9999999 被解释为版本号而不是日期。日期可以包含空格和标点符号以提高可读性,但会被忽略。 另一个基本开关

-not [file]...

不提取与任何指定文件同名的文件。file 可以包含通配符 * 和 ?,它们分别匹配任何字符串或字符,包括 /。匹配到目录也匹配其所有内容。在 Windows 中,匹配不区分大小写,并且 \ 匹配 /。在 Unix/Linux 中,带有通配符的参数必须用引号括起来,以保护它们不被 shell 展开。

-only file...

只提取与至少一个参数匹配的文件。匹配通配符的规则与 -not 相同。默认值为 *,匹配所有内容。 如果文件同时匹配 -only 和 -not 的参数,则 -not 优先。

-repack new_archive [new_password]

使用 extract 时,将提取的文件存储到 new_archive 中,而不是单独写入磁盘。 因此,您可以例如快速将所有 *.xls 文件提取到一个新的 .zpaq 中,而无需先提取再重新打包。 如果指定了 new_password,则输出将使用此密码加密。否则输出不加密,即使输入是加密的。 如果 new_archive 存在且未使用 -force 允许覆盖,则会出错。

重新打包通过复制至少被一个选定文件引用的 D 块(压缩文件内容)来实现。这可能导致比新归档更大的归档,因为同一块中未被引用的片段也会被复制。

重新打包的归档块日期范围从输入归档的第一次更新到最后一次更新。使用 add -until 指定介于这两个日期之间的日期会导致日期被调整为最后一次更新后 1 秒。

使用 -all 时,输入归档只是简单复制,不进行修改,除了解密和加密。因此,输入可以是任何文件,而不仅仅是归档。files 以及 -to、-not、-only、-until、-noattributes 和 -method 选项与 -repack -all 不兼容。

-sN -summary N -summary

简洁输出(在 zpaqfranz 中已弃用)。

-test

使用 extract 时,不写入磁盘,但正常执行所有其他操作。extract 会解压,计算输出的 SHA-1 哈希值,报告是否与存储值不同,但不比较、创建或更新任何文件。使用 -index 时,测试错误但不创建索引文件。

-tN -threads N

请注意 -tN 和 -threads N 之间的空格 并行提取最多 N 个块。默认值为 0,表示使用处理器核心数,但在 zpaqfranz 编译为 32 位代码时,不超过 2 个。选择较少的线程会减少内存使用但运行较慢。选择多于核心数的线程没有帮助。

-checksum

如果使用 -checksum 添加时存储了哈希码,则强制执行完整的哈希码验证。

-kill

提取为虚拟的、长度为 0 的文件。进行空文件完全恢复。 通常用于检查 UTF/路径长度。

-utf

将所有非拉丁字符转换为拉丁字符(Linux/*Nix => NTFS 兼容性)。

-fix255

缩短最大文件名长度,避免不同大小写冲突(Linux => NTFS)。 pippo.txt 和 PIPPO.txt 会被 7.15 静默覆盖

-fixeml

(启发式地)压缩 .eml 文件名。 例如,“Fwd Fwd Fwd Fwd pippo.eml”会变成“Fwd pippo.eml”。

-flat

将所有内容紧急恢复到单个文件夹中(Linux => NTFS),丢失路径信息。 在其他方法都失败时使用(例如,在 FAT16 软盘上提取 Linux 创建的包含中文的文件)。

-filelist

显示(如果存在)存储的 VFILE(虚拟文件)文件列表。 版本 52+ 允许使用 -filelist 开关自动添加一个文本文件,其中包含该特定版本中添加的文件列表。提取时,如果该文件存在,它将像 l (list) 命令一样显示出来。这样做的原因是一方面可以记录已完成的操作,另一方面对于包含许多版本(数千个)的非常大的归档(数百 GB),可以提高显示速度。

命令 z (删除空目录) To be updated
命令 zfs(something)

用于 ZFS 快照的命令(FreeBSD,未在 Linux 上测试)

zpaqfranz -h zfs
  • zfslist => 显示一些快照
  • zfspurge => 使用 zfs destroy 创建脚本(带 -output something.sh)
  • zfsadd => 将快照冻结到 zpaq 归档中

zfslist

显示所有快照。

zpaqfranz zfslist "*"

显示所有以 "--5d" 结尾的快照。

zpaqfranz zfslist "*" "--5d"

显示以 "zroot/ssd@2021" 开头且以 "--5d" 结尾的快照。

zpaqfranz zfslist "zroot/ssd@2021" "--5d"

将输出重定向到 pippo.sh。

zpaqfranz zfslist "zroot/ssd@2021" "--5d" -output pippo.sh

zfspurge

准备用于批量销毁快照的脚本。 功能与 zfslist 相同,只提供一个 pippo.sh 的示例。

zpaqfranz zfspurge "zroot/ssd@2021" "--5d" -output pippo.sh

zfsadd

准备用于多次 add() 操作的脚本,或将一些快照冻结到归档中。 注意:假设快照名称中“合并”了时间戳,就像 crontab 脚本那样。 头时间戳尾

  • tank/d@2021-08-12_09.00.00--7d 是好的
  • tank/pippo@quickdelete 是不好的

在此示例中,我们有 3 个快照(例如由 zfSnap 或其他工具创建)。 我们过滤“头”(第一部分,日期)和“尾”(最后部分,“--7d”)。

root@aserver:/tmp/47 # ./zpaqfranz zfslist "tank/d@2021-08-12" "--7d"
zpaqfranz v52.16-experimental snapshot archiver, compiled Aug 12 2021
tank/d@2021-08-12_09.00.00--7d
tank/d@2021-08-12_11.00.00--7d
tank/d@2021-08-12_13.00.00--7d

好的,现在我们将这 3 个快照(或 3.000 个)放入一个文件中,使用:

zpaqfranz zfsadd "tank/d@2021-08-12" "--7d" "/temporaneo/daprog2.zpaq" "scanner" -force

请注意“scanner”是一个可选的子文件夹(只是一个例子,如果省略则获取所有快照)。 -force 用于进行实际运行(直接执行)。

注意:使用双引号 " !!!!

现在我们将这 3 个快照放入归档中,占用最小空间,并用时间戳标记(您想恢复 @11:00:00 的快照吗?是的,您可以)。

root@aserver:/tmp/47 # ./zpaqfranz i /temporaneo/daprog2.zpaq
zpaqfranz v52.16-experimental snapshot archiver, compiled Aug 12 2021
/temporaneo/daprog2.zpaq:
3 versions, 3.503 files, 36.805 fragments, 2.079.947.186 bytes (1.94 GB)

Version(s) enumerator
-------------------------------------------------------------------------
< Ver  > <  date  > < time >  < added > <removed>    <    bytes added   >
-------------------------------------------------------------------------
00000001 2021-08-12 09:00:00  +00003500 -00000000 ->        2.079.563.812
00000002 2021-08-12 11:00:00  +00000002 -00000001 ->              382.735
00000003 2021-08-12 13:00:00  +00000001 -00000002 ->                  639

现在可以安全地清除最旧的快照了(通常通过 crontab)。

与 7.15 的差异
  1. zpaqfranz(默认)存储添加文件的 CRC-32。 zpaq 没有检查存储文件完整性的机制:它进行(智能的)“分块”SHA1 验证,但由于其设计,无法进行“完整”测试(例如重新计算整个文件的哈希值)。 使用 CRC-32 可以确保抵御 SHA-1 碰撞(更好:碰撞会被检测到,但不会被修复),存储 XXH3 可以轻松进行完整的提取和检查。 CRC-32/XXH3 的计算,尤其是在现代处理器上,不会显着减慢进程(约 10%)。

  2. 默认情况下,每个 .XLS 文件都会被强制添加。对于旧版 XLS 文件,检测更改的时间戳并不可靠。 如果您有许多由(例如)Excel 2000 编辑的旧版 XLS 文件,对提取的文件进行二进制(或哈希)检查会失败。 是的,我知道这很奇怪,但 Excel 可以在不“触摸”的情况下更改 XLS 文件中的某些字节(以更新上次修改时间等元数据)。 这是 zpaqfranz 的第一步,我为了发现 Excel 的这个惊人行为而抓狂。可以通过 -xls 或 -715 禁用此功能。

  3. 卷影复制 (Windows,需要管理员权限) 创建 VSS(删除所有其他已有的 VSS!),然后进行备份,通常针对“用户”特殊文件夹中的“utente”用户,像这样: zpaqfranz a z:\mycopy.zpaq c:\Users\utente\ -vss

  4. 显示的进度信息可以通过以下开关修改: -noeta, -verbose, -pakka, -debug, summary, -n x

  5. 版本的 ASCII 注释 使用 -comment sometext 开关 可以给当前版本的 归档添加“sometext”标记。 zpaqfranz a z:\mycopy.zpaq c:\pippo -comment sometext 这会使搜索或提取更容易, 而不是使用 -until。 “回滚到 sometext”。 警告:文本不应包含空格或 非 ASCII 字符,最重要的是,必须唯一。 版本注释没有重复检查。 如果多次添加相同的注释, 之后将无法使用它来提取数据。 这仍然可以通过正常使用 -until 实现。

  6. zpaqfranz 支持在标准 .zpaq 归档上使用 -stdin 和 -stdout。

与 7.15 添加文件的差异 1. > zpaqfranz(默认)存储添加文件的 CRC-32。 zpaq 没有检查存储文件完整性的机制:它进行(智能的)“分块”SHA1 验证,但由于其设计,无法进行“完整”测试(例如重新计算整个文件的哈希值)。 使用 CRC-32 可以确保抵御 SHA-1 碰撞(更好:碰撞会被检测到,但不会被修复),存储 XXH3 可以轻松进行完整的提取和检查。 CRC-32/XXH3 的计算,尤其是在现代处理器上,不会显着减慢进程(约 10%)。
  1. 默认情况下,每个 .XLS 文件都会被强制添加。对于旧版 XLS 文件,检测更改的时间戳并不可靠。 如果您有许多由(例如)Excel 2000 编辑的旧版 XLS 文件,对提取的文件进行二进制(或哈希)检查会失败。 是的,我知道这很奇怪,但 Excel 可以在不“触摸”的情况下更改 XLS 文件中的某些字节(以更新上次修改时间等元数据)。 这是 zpaqfranz 的第一步,我为了发现 Excel 的这个惊人行为而抓狂。可以通过 -xls 或 -715 禁用此功能。

  2. 卷影复制 (Windows,需要管理员权限) 创建 VSS(删除所有其他已有的 VSS!),然后进行备份,通常针对“用户”特殊文件夹中的“utente”用户,像这样: zpaqfranz a z:\mycopy.zpaq c:\Users\utente\ -vss

  3. 显示的进度信息可以通过以下开关修改: -noeta, -verbose, -pakka, -debug, summary, -n x

  4. 版本的 ASCII 注释 使用 -comment sometext 开关 可以给当前版本的 归档添加“sometext”标记。 zpaqfranz a z:\mycopy.zpaq c:\pippo -comment sometext 这会使搜索或提取更容易, 而不是使用 -until。 “回滚到 sometext”。 警告:文本不应包含空格或 非 ASCII 字符,最重要的是,必须唯一。 版本注释没有重复检查。 如果多次添加相同的注释, 之后将无法使用它来提取数据。 这仍然可以通过正常使用 -until 实现。

  5. zpaqfranz 支持在标准 .zpaq 归档上使用 -stdin 和 -stdout。

与 7.15 提取文件的差异 1. > 在提取过程中,如果存在控制信息(CRC-32), 就像默认设置那样, 在提取结束时, 会检查这些代码,以验证文件 是否已正确存储。
  1. -checksum 提取的文件将被重新读取并验证 SHA1 代码。 这是一个会延长耗时但能提高安全性的措施。

  2. -kill 提取为虚拟的、长度为 0 的文件。模拟一次完整恢复 (对奇怪的文件名有用) 基本上,您可以使用所有提取功能来模拟恢复(例如在 RAMDISK 上),而无需写入数据。 因此,这不是 list() 操作,而是真正的 extract() 操作。 extract() 会尝试拦截“磁盘已满”的错误。

  3. 互操作性 有时由于各种原因(路径过长和文件名过于“奇怪”),在 Windows 上恢复 *nix 归档文件是不可能的。 这真的很糟糕(无法恢复数据),因此有一些 新开关来处理这些情况: -utf 将所有非拉丁字符转换为拉丁字符 -fix255 缩短最大长度至 255,避免大小写冲突 (pippo.txt 和 PIPPO.txt 会被 7.15 静默覆盖)。 -fixeml 压缩 .eml 文件名 -flat 将所有内容紧急恢复到单个文件夹。 然而,如果所有其他方法都失败了,您仍然可以将内容提取到 Windows,无论它最初有多么“奇怪”。

与 7.15 列表的差异 使用 files 参数时,将归档内容与一个或多个目录进行比较(检查)。 实际上,这更像是一种“验证”而不是“列出”。 zpaq 的旧版“数据分析”功能已被移除,因此以下命令
  zpaq list backup dir1 -to dir2 -not =        (比较日期)
  zpaq list backup dir1 -to dir2 -not = -force  (比较内容)

不再起作用。 这是 zpaqfranz 最大的向后不兼容之处。

这种比较比标准方法快得多,因为它只对文件系统中存在的文件的 SHA1 代码进行块计算,而不会提取归档中的文件。

它还会检查 CRC-32,以拦截任何(非常罕见的)SHA-1 碰撞。

在执行 add() 后,您可以使用完全相同的参数执行 list(),并进行非常快速(但安全)的验证。

zpaqfranz a z:\1.zpaq c:\z
zpaqfranz l z:\1.zpaq c:\z
与 7.15 新命令的差异 新命令 s (size) 返回 N 个目录的累计大小, 以及其文件系统上的可用空间估算。 文件名中包含 .zfs 的所有内容将被忽略, 以及 :$DATA (Windows 的 ACL)。 它用于快速检查同步文件夹: 在 UNIX / Linux 中,没有简单的方法可以立即 知道包含子文件夹的文件夹有多大。 同样,在 UNIX / Linux 中,要对设备上的可用空间 有一个至少是指示性的概念也不容易。 -all N 将创建并发线程,每个线程扫描一个从属目录。 它用于在不同设备上并行操作,最大限度地缩短扫描时间 (例如:不同 NAS 上的从属目录)。

新命令 sha1 (hashes)
计算文件/目录的 SHA1(或其他哈希/校验和),
候选重复项,以及累计的 GLOBAL SHA256(哈希的哈希)。
如果两个目录具有相同的 GLOBAL 哈希,则它们 ==。
-xxhash 非常快的哈希算法 (XXH3)
-crc32 非常快的校验和
-crc32c 非常快的硬件加速 CRC-32c
-sha256 慢但非常可靠
将来可能还会加入 myhash 和 Whirlpool 的组合。
-all 创建 N 个线程(不要用于机械硬盘,但适用于 SSD 和 NVMe)
以非常快的速度计算(在我的 PC 上高达 23GB/s)。
-kill 显示要删除的文件,以便手动去重
(是的,它是通过重定向到脚本来使用的)
-checksum 获取 1 级校验和,用于比较
分层组织的文件夹。
-summary 只显示 GLOBAL(快速手动比较目录)
-forcezfs 强制包含 .zfs 路径(默认:跳过)

新命令 dir (dir)
如果说 UNIX 和 Linux 有一点我特别讨厌的话,
那就是 ls 命令,因为它不像 Windows 的 dir 命令那样
显示累计文件大小(!)。
c:\z 文件夹及其子目录有多大?
zpaqfranz dir c:\z /s -n 1
zpaqfranz dir c:\z /s |tail -2
这是一种迷你克隆,为了方便起见,可以与 shell 别名一起使用。
主要开关有 /s, /os, /on, /a, -n X 类似于 tail -n。
c:\z 目录中最大的文件是什么
(递归查找)?
zpaqfranz dir c:\z /s /os
c:\z 中最大的 10 个文件?
zpaqfranz dir c:\z /s /os -n 10
也可以查找重复文件(-crc32 或 -crc32c)
就像 rar a -oi3:1 -r dummy s:\ 一样。
c:\z 中最大的 100 个重复文件?
zpaqfranz dir c:\z /s -crc32 -n 100

新命令 i (info)
显示 ZPAQ 的版本,就像 (对于 zpaqfranz) l -all -comment 一样
包含大小(和注释,如果存在)。
zpaqfranz i z:\1.zpaq

新命令 utf (处理奇怪的文件名)
检查(或清理)包含非拉丁字符和/或
长度 > 260 的路径。
-dirlength X (设置“修复”)
-filelength Y
-utf (清理文件名)
-fix255 (清理文件长度和文件大小写)
-fixeml (清理 .eml 文件名)
-kill (执行修复 => 转换为拉丁字符)

新命令 f (fill, or wipe)
填充(擦除)几乎所有磁盘空间,并检查数据是否良好
写入,以 500MB 为块(伪随机),到新的
ztempdir 文件夹中。
两种用途:用不可压缩的数据擦除(清除)空间,
检查磁盘控制器-系统-内存是否正常工作。
-verbose 显示写入速度(用于检查速度一致性)
-kill 删除(运行后)临时文件名。

新命令 k (kill, risky!)
杀死(删除)所有不在归档中的文件和目录。
移除多余的文件。
示例:
zpaqfranz a z:\1.zpaq c:\z
zpaqfranz x z:\1.zpaq c:\z -to z:\knb
... 在 z:\knb 中发生了一些事情,我们想恢复到归档状态 ...
... 不删除所有内容并重新提取 ...
zpaqfranz x z:\1.zpaq c:\z -to z:\knb -force
zpaqfranz k z:\1.zpaq c:\z -to z:\knb

新命令 r (robocopy)
r d0 d1 d2... 镜像 d0 到 d1,d2... 就像 robocopy /mir
-kill 实际运行(默认:dry-run)
-all 为每个文件夹运行一个线程
-verify 复制后快速检查是否正常
-checksum 严格(哈希)检查 -xxhash...

新命令 d (deduplicate)
d d0 去重文件夹 d0,不询问!
-force 实际运行(默认:dry-run)
-sha256 使用 sha256 而不是 XXH3 进行检测
-verbose 显示重复文件

与 7.15 的差异:新接口 新命令/接口 在自动化执行期间,可以启动脚本 发送警告(例如失败或成功) 它不是在脚本中检查结果代码, 而是直接运行脚本或程序 -exec_ok fo.bat 成功后启动 fo.bat -exec_error kz 失败后启动 kz

新命令/接口用于帮助
help 详细帮助
-h 详细帮助
-he 显示示例
-diff 显示与 7.15 的差异

各种接口
-715 功能大致与 v7.15 相同
-summary 保留用于兼容性,但已更改:如果 >0 => 只显示摘要
-noeta 不显示 ETA(用于脚本)
-pakka 简洁的新式输出(10% 更新)
-verbose 不那么简洁 😃
-zfs 跳过包含 .zfs 的路径(用于 ZFS 快照)
-forcezfs 强制包含 .zfs 的路径(Windows 覆盖 -zfs)
-noqnap 跳过包含 @Recently-Snapshot 和 @Recycle 的路径
-forcewindows 获取 ACL 和 System Volume Information(zpaqfranz 默认:否)
-xls 不总是强制添加 XLS
-nopath 不存储路径
-nosort 添加或列出时不排序文件
-find X 在完整文件名中搜索 X(例如 list)
-replace Y 将完整文件名中的 X 替换为 Y(例如 list)
-n X 在 dir 中只打印最后 X 行(类似于 tail)/前 X 行(list)
-limit X (类似于 -n)
-minsize X 跳过指定长度以下的文件(add(), list(), dir())
-maxsize X 跳过指定长度以上的文件(add(), list(), dir())
-filelength X Utf 命令:查找长度 >X 的文件,提取最大文件长度
-dirlength X Utf 命令:查找长度 >X 的目录,提取最大目录长度
-comment foo 添加/查找版本的 ASCII 注释字符串
-vss 对 C 盘进行 VSS(需要管理员权限的 Windows)
-crc32c 使用 CRC32c
-crc32 使用 CRC32
-xxhash 使用 XXH3
-sha256 使用 SHA256
-exec_ok fo.bat 成功后启动 fo.bat
-exec_error kz 失败后启动 kz
-kill 显示重复文件的“脚本就绪”日志
-kill 在提取时写入 0 字节文件而不是数据
-utf 移除非 utf8 字符
-utf8 类似于 -utf
-fix255 缩短总文件长度并处理大小写冲突 (NTFS)
-fixeml 启发式压缩 .eml 文件名(Fwd Fwd Fwd => Fwd)
-flat 所有内容放到单个路径中(紧急提取奇怪的文件)
-debug 显示大量信息(超级详细)

与 7.15 的差异:test 命令 新命令 t (test) 与 7.15 相比,不仅检查 块是否可提取, 还检查单个文件的 CRC-32 校验和 是否与实际提取数据时 生成的一致。 -verify 用于文件系统后检查 (检查 STORED CRC == DECOMPRESSED == FROM FILE) 使用此开关时,文件会逐个从文件系统重新读取 并进行比较。 -verbose 通常用于模拟恢复时, 以确保提取的文件与原始文件 完全一致,毫无疑问。
示例 添加 从构建版本 52 开始(默认),zpaqfranz 将存储每个文件的 CRC-32 和 XXH3 代码,且不会显著降低速度。 如果存在这些信息,可以使用命令 l (list) 的相应开关显示。请参阅相关示例。

添加两个文件夹到归档,默认压缩:

zpaqfranz a z:\1.zpaq c:\data\\* d:\pippo\\*

添加一个文件夹,不压缩(只去重):

zpaqfranz a z:\1.zpaq c:\nz\\* -m0

添加一个文件夹,更好的压缩:

zpaqfranz a z:\1.zpaq c:\nz\\* -m2

添加文件夹,最大压缩:

zpaqfranz a z:\c.zpaq c:\nz\ -m5

添加文件夹 (c:\zpaqfranz) => 重命名到 y:\mynewplace:

zpaqfranz a z:\1.zpaq c:\zpaqfranz\\* -find c:/zpaqfranz/ -replace y:/mynewplace/ -noeta

不显示 ETA

添加两个文件:

zpaqfranz a z:\4.zpaq.zpaq c:\vecchio.sql r:\1.txt

注意:是文件,不是文件夹

添加文件夹,带加密:

zpaqfranz a z:\b.zpaq c:\nz\ -key mygoodpassword

添加一个文件,忽略日期和时间,不压缩,简洁输出并验证:

zpaqfranz a z:\test\backup\thecopy.zpaq e:\parte\container.truecrypt -force -method 0 -pakka -test

使用 TrueCrypt/VeraCrypt 卷时,需要强制添加(),禁用压缩(加密归档无用)

添加文件夹,存储完整哈希 SHA1:

zpaqfranz a z:\2.zpaq c:\nz\ -sha1

已弃用:将存储每个文件的 SHA-1 代码(如版本 52 之前),但会显著减慢速度。

添加文件夹,存储完整哈希 SHA256,早期检查 SHA-1 碰撞:

zpaqfranz a z:\2.zpaq c:\nz\ -sha256 -verify

-verify 在发生 SHA-1 碰撞时会阻止添加(减慢约 +10%)。否则需要进行 control t (test)

添加文件夹,然后验证:

zpaqfranz a z:\3.zpaq c:\nz\ -test

添加就像 zpaq 7.15:

zpaqfranz a z:\5.zpaq c:\audio -715

禁用 zpaqfranz 扩展。不存储 CRC-32 和 XXH3(更快),不忽略 .zfs 和 ADS 等

添加但不带 CRC-32/哈希:

zpaqfranz a z:\e.zpaq c:\nz\ -nochecksum

不存储 CRC-32 和 XXH3(运行最快),忽略 .zfs 和 ADS 等

添加并用 ASCII 文本标记版本:

zpaqfranz a z:\6.zpaq c:\data\\* -comment first_copy
zpaqfranz a z:\6.zpaq c:\data\\* -comment second_copy
zpaqfranz a z:\6.zpaq c:\data\\* -comment third_copy

通过 VSS 添加(Windows 管理员权限):

zpaqfranz a z:\7.zpaq c:\users\utente\\* -vss

仅在 Windows 上,将删除 C:\ 上的所有 VSS

添加带时间戳的文件夹 (zfs):

zpaqfranz a z:\8.zpaq c:\data\\* -timestamp 2021-12-30_01:03:04

请注意:版本必须按单调递增顺序排列。使用适当的 zfSnap 或其他工具

创建多卷归档:

zpaqfranz a "z:\9_????.zpaq" c:\data\\

在此示例中,使用 4 位数字(因为有 4 个问号)

创建索引多卷归档:

zpaqfranz a "z:\a_???.zpaq" c:\data\\ -index z:\a_000.zpaq

存储文件列表 VFILE:

zpaqfranz a z:\d.zpaq c:\nz\ -filelist

VirtualFile 是一个 .txt 文件,包含添加到版本 X 的所有文件列表。可以与 x -filelist 一起使用,快速创建列表,比命令 l (list) 对于非常大的归档更快。

添加一个文件夹到空目标,默认压缩:

zpaqfranz a "" c:\nz\\*

注意空文件名 ""。通常用于调试、基准测试或开发。

添加数据到归档 z:\1.zpaq。如果大小超过 2000000000,则移动到 y:\archive 并从头开始:

zpaqfranz a z:\1.zpaq c:\nz\ -freeze y:\archived -maxsize 2000000000

注意:如果归档已存在,它将被重命名,不会覆盖。所以 z:\1.zpaq => y:\archived\1.zpaq。下一轮 z:\1.zpaq => y:\archived\1_0000001.zpaq

示例 比较 ### 比较主目录 d0 与从目录 d1, d2, d3:
zpaqfranz c c:\\d0 k:\\d1 j:\\d2 p:\\d3

多线程比较:

zpaqfranz c c:\\d0 k:\\d1 j:\\d2 p:\\d3 -all

哈希(“硬”)比较 d0 与 d1, d2, d3:

zpaqfranz c c:\\d0 k:\\d1 j:\\d2 p:\\d3 -checksum

使用 crc32c 哈希(“硬”)比较 d0 与 d1, d2, d3:

zpaqfranz c c:\\d0 k:\\d1 j:\\d2 p:\\d3 -checksum -crc32c

使用 sha256 哈希(“硬”)比较 d0 与 d1, d2, d3:

zpaqfranz c c:\\d0 k:\\d1 j:\\d2 p:\\d3 -checksum -sha256
示例 解压 默认情况下,zpaqfranz 会将数据提取到其原始位置(但不覆盖)。

提取到文件夹 z:\muz7\:

zpaqfranz x z:\1.zpaq -to z:\muz7\

0 字节文件(检查恢复):

zpaqfranz x z:\1.zpaq -to z:\muz7\ -kill

提取到单个目录:

zpaqfranz x z:\1.zpaq -to z:\muz7\ -flat

提取时不进行 utf、<255、.eml 处理:

zpaqfranz x z:\1.zpaq -to z:\muz7\ -utf -fix255 -fixeml

强制覆盖提取:

zpaqfranz x z:\1.zpaq -to z:\muz7\ -force

提取版本 3:

zpaqfranz x z:\1.zpaq -to z:\muz7\ -until 3

提取多卷归档的最新版本:

zpaqfranz x "z:\a_???" -to z:\ugo\

注意双引号

将所有版本提取到 muz7:

zpaqfranz x z:\1.zpaq -to z:\muz7\ -all

显示文件列表(如果存在):

zpaqfranz x z:\1.zpaq -filelist

显示 v3 的文件列表(如果存在):

zpaqfranz x z:\1.zpaq -filelist -until 3

将所有 *.xls 文件复制到新归档:

zpaqfranz x z:\1.zpaq *.xls -repack onlyxls.zpaq
示例 列表 ### 显示最新版本:
zpaqfranz l z:\1.zpaq

最新版本带校验和:

zpaqfranz l z:\1.zpaq -checksum

紧凑输出:

zpaqfranz l z:\1.zpaq -checksum -summary

显示所有版本:

zpaqfranz l z:\1.zpaq -all

显示版本注释(如果存在):

zpaqfranz l z:\1.zpaq -comment

显示版本注释(详细):

zpaqfranz l z:\1.zpaq -comment -all

只显示存储的 'zpaq.cpp'(简洁):

zpaqfranz l z:\1.zpaq -find zpaq.cpp -pakka

查找并替换(类似于 awk 或 sed):

zpaqfranz l r:\1.zpaq -find c:/biz/ -replace z:\mydir\

列出最大的 10 个文件:

zpaqfranz l z:\1.zpaq -n 10

列出最大的 10 个 exe 文件:

zpaqfranz l z:\1.zpaq -only *.exe -n 10

与磁盘上的文件进行比较:

zpaqfranz l z:\1.zpaq c:\nz

这实际上是一种验证。 请注意文件夹指定末尾的 "\"。

示例 测试 ### 测试最新版本:
zpaqfranz t z:\1.zpaq

测试所有版本:

zpaqfranz t z:\1.zpaq -all

与文件系统比较:

zpaqfranz t z:\1.zpaq -verify

使用分块 SHA-1 进行高度可靠(快速)比较(list,nz 为源目录):

zpaqfranz t z:\1.zpaq c:\nz

将文件提取到 y:\muro 文件夹,检查错误:

zpaqfranz t z:\k2.zpaq -to y:\muro -paranoid -verbose

这可能是最极端的偏执级别检查。将进行所有内容的完全恢复。

快速入门:FreeBSD # 新手提示:FreeBSD

zpaqfranz 是一个开源软件:您需要从“某个地方”下载、编译,然后安装(=复制到 /bin 或 /usr/bin,或 /usr/local/bin 或其他任何地方)。

下面我们将一步一步地展示如何在全新安装的 FreeBSD 13 系统上进行操作(对于其他版本几乎相同):您可能需要一些工具,这些工具可能已经安装,也可能没有。在示例中,我假设它们都没有安装。

  • 正常工作的互联网连接以下载所需内容

  • 编译器。通常是 gcc(或 clang),实际上是 g++。

  • “某些工具”用于从互联网下载文件。通常是 wget

  • make 命令(如果您选择使用 Makefile)

  • “某些工具”用于确保(下载的)Makefile 是“Unix”风格的。通常是 dos2unix

点击此处观看 FreeBSD 13 上的视频示例

以下是需要执行的简短命令列表:

pkg install -y gcc wget unix2dos
mkdir /tmp/zp
cd /tmp/zp
wget https://raw.githubusercontent.com/fcorbelli/zpaqfranz/main/zpaqfranz.cpp
wget https://raw.githubusercontent.com/fcorbelli/zpaqfranz/main/Makefile
dos2unix Makefile
make install clean

解释:

pkg install -y gcc wget unix2dos 下载并安装 gcc(编译器)、wget(下载工具)、unix2dos(转换为 Unix 风格文本文件,实际上我们需要 dos2unix)。-y 开关表示默认“回答 YES”。 mkdir /tmp/zp 在 "/tmp" 中创建 ("makedir") 一个临时目录 "zp"。 cd /tmp/zp 进入此目录 (cd=change dir)。 wget https://raw.githubusercontent.com/fcorbelli/zpaqfranz/main/zpaqfranz.cpp 从 github 下载 zpaqfranz.cpp 源代码。当然您也可以“手动”下载。 wget https://raw.githubusercontent.com/fcorbelli/zpaqfranz/main/Makefile 从 github 下载 Makefile(我们很懒,将使用 make)。 dos2unix Makefile 确保 Makefile 不包含 CR/LF,只包含 LF,否则 make 会中止(make 工具非常非常挑剔)。 make install clean 编译 zpaqfranz.cpp 生成 zpaqfranz 可执行文件,并复制到 /usr/local/bin。

更深入一点:如何手动编译(不使用 Makefile)

我们付出了很多努力(和权衡)来使编译尽可能简单。

最短的命令列表是:

pkg install -y gcc wget
mkdir /tmp/zp
cd /tmp/zp
wget https://raw.githubusercontent.com/fcorbelli/zpaqfranz/main/zpaqfranz.cpp

或者“以某种方式”获取 zpaqfranz.cpp。

g++ -Dunix -O3 -march=native zpaqfranz.cpp -o zpaqfranz -pthread -static

解释:

g++

我们默认使用 C++ 模式的 gcc,您也可以使用 clang++。

-Dunix

定义一个常量,我们需要一个 Unix 版本的 zpaqfranz,而不是 Windows 版本。

-O3

优化代码 = 更快。

-march=native

为本机架构生成程序。

zpaqfranz.cpp

编译 zpaqfranz.cpp。

-o zpaqfranz

输出 zpaqfranz(可执行文件)。

-pthread

使用 pthread 库。

-static

生成一个“静态”可执行文件,不需要外部库。

快速入门:隐藏的 Gem *正如通常一样,如果可执行文件的名称是 `dir` 或 `robocopy`,zpaqfranz 的行为会有所不同。*

如果(非 Windows)可执行文件名为 "dir",则其行为(几乎)就像 Windows 的 dir 命令。

小心与其他名为 "dir" 的软件发生冲突。 您可以简单地将 zpaqfranz 可执行文件本身复制到 /usr/bin/usr/local/bin 文件夹(取决于您的系统),或者创建一个符号链接。 现在您可以在 (*nix) 系统上输入类似 dir /tmp /s /os 的命令了。

如果(非 Windows)可执行文件名为 "robocopy",则其运行方式类似于 robocopy。

例如 robocopy /tmp/zp /tmp/backup1 /tmp/backup2

注意:这些是实际运行 (-kill 自动启用),并且启用了 -space!

快速入门:Linux 有很多 Linux 系统运行在很多不同的硬件上。

务必“正确地”编译 zpaqfranz。 “Intel” 指的是带有 SSE2 的 amd64 和 x86 架构。也就是:64 位 Intel/AMD CPU,或带有 SSE2 的 32 位“i386-like”CPU。

简而言之,在非 Intel 平台上必须使用 -DNOJIT。

非常老旧和“小型”的设备(例如 NAS)

g++ -O3 -DANCIENT -Dunix -DNOJIT zpaqfranz.cpp -o zpaqfranz -pthread

Intel(各种类型)

g++ -Dunix -O3 zpaqfranz.cpp -o zpaqfranz -pthread

Intel(各种类型 + AMD '黑苹果')

g++ -Dunix -DHWSHA2 -O3 zpaqfranz.cpp -o zpaqfranz -pthread

非 Intel CPU(即:ARM, Apple M1/M2, sparc, 其他)

不要忘记 -DNOJIT!!!!!

g++ -Dunix  -O3 -DNOJIT zpaqfranz.cpp -o zpaqfranz -pthread
快速入门:Mac (抱歉,不支持 Motorola)Macintosh 有 4 种“类型”:
  • 较旧的 PowerPC

  • 基于 Intel 的

  • 基于 AMD 64 的“黑苹果”(是的,它们存在)

  • Apple 芯片驱动的 (M1/M2)

务必“正确地”编译 zpaqfranz。

简而言之,在非 Intel Mac 上必须使用 -DNOJIT。

PowerPC 使用 gcc4.x

g++ -O3 -DBIG -DANCIENT -Dunix -DNOJIT zpaqfranz.cpp -o zpaqfranz -pthread

Intel(各种类型)

g++ -Dunix -O3 zpaqfranz.cpp -o zpaqfranz -pthread

Intel(各种类型 + AMD '黑苹果')

g++ -Dunix -DHWSHA2 -O3 zpaqfranz.cpp -o zpaqfranz -pthread

Apple M1/M2

不要忘记 -DNOJIT!!!!!

g++ -Dunix  -O3 -DNOJIT zpaqfranz.cpp -o zpaqfranz -pthread
快速入门:Windows 以下是我已编译的三个版本的 zpaqfranz 二进制文件:

1) zpaqfranz.exe

这是 64 位“正常”版本。

zpaqfranz v58.9e-JIT-GUI-L,HW BLAKE3,SHA1/2,SFX64 v55.1,(2023-08-23)

在此示例中:

  • 版本 58.9e

  • JIT 通过即时编译 PAQL 操作码到 amd64 机器码

  • GUI 启用 -gui 控制台 GUI

  • L 小端序 CPU

  • HW BLAKE3 带硬件加速的 Blake3 哈希器

  • SHA1/2 如果检测到,带硬件 SHA1/SHA256 加速

  • SFX64 带 Windows-64 位 SFX 模块,版本 55.1

2) zpaqfranz32.exe

这是 32 位版本。最多使用 2GB RAM,最多 2 个线程。

zpaqfranz v58.10a-JIT-GUI-LSFX32 v55.1,(2023-08-25)

在此示例中:

  • 版本 58.10a

  • JIT 通过即时编译 PAQL 操作码到 amd64 机器码

  • GUI 启用 -gui 控制台 GUI

  • L 小端序 CPU

  • SFX32 带 Windows-32 位 SFX 模块,版本 55.1

3) zpaqfranzhw.exe

这是一个特殊的 64 位版本,带硬件加速,需要通过 -hw 开关手动启用。

zpaqfranz v58.9e-JIT-GUI-L,HW BLAKE3,SHA1,SFX64 v55.1,(2023-08-23)

在此示例中:

  • 版本 58.9e

  • JIT 通过即时编译 PAQL 操作码到 amd64 机器码

  • GUI 启用 -gui 控制台 GUI

  • L 小端序 CPU

  • HW BLAKE3 带硬件加速的 Blake3 哈希器

  • SHA1 带硬件 SHA1 加速,通过 -hw 启用

  • SFX64 带 Windows-64 位 SFX 模块,版本 55.1

zpaqfranz.exe 和 zpaqfranzhw.exe 有什么区别?

*zpaqfranz.exe 会自动检测并硬件加速 SHA1 和 SHA256(如果存在)。zpaqfranzhw 通过不同的 asm 代码,在使用 -hw 开关时硬件加速 SHA1。zpaqfranzhw 在(例如)AMD Ryzen 上使用时比 zpaqfranz.exe(稍微)快。差异不大。正如您可能猜到的,我使用...一台 Ryzen 机器进行开发 😃 *

实际情况:常用命令 ### 最常用命令

zpaqfranz 有许多命令,但让我们重点关注最重要的几个。

a (add) 是将数据添加到 .zpaq 归档的命令。

我已经介绍过它了,所以不再赘述。

zpaqfranz a d:\thebackup.zpaq c:\data

i (info) 是获取归档信息的命令。

它包含多少个版本,它们何时创建等。有很多开关(请参阅相关页面),但最直接的使用方法是简单地:

zpaqfranz i nameofthe.zpaq

这将显示版本号、日期、添加了多少文件、删除了多少文件以及压缩后的大小。

l (列出归档内的文件)

您也可以直接运行此命令:

zpaqfranz l nameofthe.zpaq

有一个值得记住的开关是 -all。这将显示所有版本的信息,而不仅仅是最新版本(这是默认设置)。

t (test) 命令,

您可以直接调用,例如:

zpaqfranz t nameofthe.zpaq

x (extract) 命令,

稍微复杂一些,所以我建议您参考相关文档。

尽管它比其他命令更复杂,但其基本用法是直接的。 要从归档中提取所有文件(到原始位置),您可以简单地使用:

zpaqfranz x nameofthe.zpaq

要将文件提取到“某个地方”,您可以使用 -to 开关,后跟您希望文件提取到的目录:

zpaqfranz x nameofthe.zpaq -to extracted_folder/

还有其他高级命令和选项用于处理更复杂的场景,但对于大多数用户而言,上述命令(a, i, l, t, x)将涵盖几乎所有常见需求。

如您所见,您不需要广泛的专业知识即可使用 zpaqfranz,因为您可以依赖默认参数。

实际情况:进行备份 ## 简介

zpaqfranz 是一个混合数据归档工具。这意味着什么?它会压缩数据,这些数据可以用于备份,并在需要时恢复。虽然它确实提供高级备份功能(主要面向高级用户),但它更类似于传统的归档工具,如 WinZIP、RAR 或 7zip。

如果您需要一个**“真正”的备份程序**,您可能需要寻找其他工具。

现在,让我们以您可能熟悉的 7zip 为参考,简要探讨 zpaqfranz 的工作原理以及它与其他归档工具的区别。

本质上,zpaqfranz 读取一组文件和文件夹,处理它们,并将它们写入一个归档文件。这个归档文件是一个扩展名为 .zpaq 的文件,包含所有选定的文件,就像您使用 7zip 将文档存储在 .7z 文件中一样。

版本控制

关键区别就在这里。zpaqfranz 可以在同一个 .zpaq 归档中存储文件的多个版本。如果您熟悉 Mac 上的 ZFS 快照TimeMachine,这个概念应该会很熟悉。

示例:

假设您有一个名为 pippo.doc 的文档。您将其归档到一个压缩文件 thebackup.zpaq 中,创建了版本 1

现在,您修改了 pippo.doc 的内容。这个新文件与版本 1 不同。当您使用 zpaqfranz 再次将其归档到同一个 thebackup.zpaq 中时,它将存储两个版本:

  • 版本 1(原始版本)

  • 版本 2(修改后的版本)

这个过程可以继续进行,包括版本 3、4、5 等。

总结:

在一个 .zpaq 归档中,您可以维护同一个文件的多个版本。每次您再次归档一个文件时,都会存储一个新版本。然后,您可以在以后提取任何特定版本。例如,您可能想在今天恢复 pippo.doc昨天版本

这种版本控制功能通常不被传统归档工具支持,传统归档工具只在归档中存储文件的最新版本。

重复备份

在实际场景中,通常会定期进行重复备份。例如,假设您有一个文件夹 C:\dati,并且每天晚上,您都会在另一个存储设备(如 USB 硬盘)上创建备份,保存为 D:\thebackup.zpaq

目前,我们先不讨论“如何”做——我们稍后会介绍。关键思想是,通过安排一个批处理程序在每天凌晨 3:00 运行,您可以备份文件夹中的所有数据,确保它们安全存储。

清晰 (?) 的示例:

如果今天您从 C:\dati 中删除了 pippo.doc 并继续运行备份,您仍然可以恢复这两个版本:

  • pippo.doc版本 1

  • pippo.doc版本 2

即使文件已从您的原始文件夹中删除,它仍然完整地保留在 .zpaq 备份中,以及其所有先前的版本。

关键点

一旦数据被添加到 .zpaq 归档中,它就永远不会被删除。它将永久保留在那里。因此,如果在某个时间点(例如一年前)您的 C:\dati 文件夹中有一个名为 pluto.doc 的文件,并且它被包含在备份中,即使一年后您仍然可以恢复它——即使整个 C:\dati 文件夹已经被删除。

这就是为什么在处理重复备份时,zpaqfranz(我们应该始终感谢 zpaq 的原始创建者,Matt Mahoney 博士——主要功劳归他所有)比传统归档工具无可比拟地更好

另一个示例:数据库备份

一个常见的场景是备份数据库。许多网站使用 RDBMS 程序(如 MySQL、MariaDB、Postgres 等)来管理数据。使用各种工具(我们在这里不详细介绍)定期备份这些数据是标准做法。这些备份通常被称为 dump,并以固定的间隔(每天、每小时或每 15 分钟——取决于具体情况)创建。

这个过程允许根据 dump 的频率恢复数据。

时间戳

一种常见的方法是为每个 dump 添加一个时间戳,本质上是创建按创建时间标记的单独备份。例如,如果您每天备份,您可能会有:

  • themygooddump_2024_09_01.sql

  • themygooddump_2024_09_02.sql

  • themygooddump_2024_09_03.sql

如果您想恢复 2024 年 9 月 1 日的备份,您将保留该 dump 文件以及后续日期的文件。然而,随着您积累的 dump 越来越多,您最终需要修剪旧的 dump 以释放空间。例如,您可能会删除 2024 年 9 月 1 日的 dump,从而永久丢失数据库和备份中的该数据。

这种删除旧数据以节省空间的做法非常常见。

zpaq 的魔力

有了 zpaq,这个问题就不存在了。数据永远不会被删除——它会永久保留。这对于任何管理备份的人来说都是梦想。

zpaq 如何实现这一点?

这是一个复杂的过程,有很多页面解释细节,但现在,请相信我(稍后您可以深入研究文档)。简单来说,zpaq 使用最小的空间存储文件的不同版本。它不是为每个版本多次保存整个文件,而是只存储版本之间的差异

简单地说:如果 pippo.doc版本 1版本 2 几乎相同,zpaq 只会存储微小的更改,因此使用的空间大致相当于 pippo.doc单个副本的大小。

总结

zpaq 将指定文件夹集中的所有数据存储在一个归档中。每次您运行相同的备份命令(本质上是触发更新或“刷新”)时,数据都会保存到归档中,而不会修改或删除旧版本。

每日备份场景

在典型的每日更新备份场景中,您将能够从任何给定日期恢复数据的完整状态,即使是几年前的数据。由于 zpaq 高效的存储技术,空间占用极少,使您能够保留数千个版本而不会过度使用磁盘空间。

用例:每日备份

如果您只是想创建数据的单个副本,例如将其移动到 USB 驱动器上,zpaqfranz 不是最佳工具。对于这种情况,您最好使用 7z、WinRAR 或类似的归档软件。

然而,如果您的目标是创建文件的每日(甚至每小时)备份,确保它们免受更改、删除(即使是意外的)或勒索软件的侵害,zpaqfranz 是理想的解决方案。它将轻松处理重复备份,同时保留您的所有旧版本数据。

实际情况:最快的开始 ## 快速示例:基本用法

zpaqfranz 提供了几种操作模式,但对于赶时间的人来说,这里有一个简单的示例。假设您想将文件夹 C:\dati 备份到 D:\thebackup.zpaq。您可以使用以下命令:

zpaqfranz a d:\thebackup.zpaq c:\dati

解释:

  • 命令 a 代表 add(添加)。

  • 它有两个参数:   1. 归档文件的名称(在本例中为 D:\thebackup.zpaq)。   2. 您要备份的文件夹(C:\dati)。

就是这样。无需额外设置。我建议您在自己的计算机上运行一个测试,熟悉这个过程。

会发生什么?

第一次运行期间,zpaqfranz 将扫描文件夹 C:\dati,枚举文件,并将它们逐个归档到 .zpaq 文件中——就像您使用 7z、RAR 或 tar 等工具一样。在此阶段,文件会被压缩(尽管压缩过程更复杂,我们暂时跳过),它们将在归档中占用一定的空间。

后续运行

现在,让我们修改文件夹 C:\dati。您可能会添加新文件、删除一些文件或更改现有文档。进行更改后,再次运行完全相同的命令

zpaqfranz a d:\thebackup.zpaq c:\dati

“神奇地”,.zpaq 归档将被更新,但这次过程会快得多,并且文件大小的增加将非常小。自己尝试一下,看看区别。

自动化备份

正如您所想象的,命令每次都保持不变这一事实使得自动化备份过程变得非常容易。例如,您可以在类 Unix 系统上使用 crontab,或在 Windows 上使用任务计划程序来定期运行该命令。

今日课程:ADD 命令

总结重点:要使用 zpaqfranz 执行备份,您将使用 a 命令(代表“add”)。语法很简单:

zpaqfranz a <archive_name.zpaq> <source_folder>
  • a:将文件添加到归档的操作。

  • <archive_name.zpaq>.zpaq 归档的名称和位置。

  • <source_folder>:您要备份的文件夹(或多个文件夹)。

就是这样!您可以指定一个或多个文件夹,用空格分隔,它们都将被添加到指定的归档中。

实际情况:基础知识 ## 理解命令 `a`

让我们深入探讨 a (add) 命令的基础知识。

1) 添加多个文件夹或文件

在归档名称之后,用空格分隔指定的所有文件夹或单个文件都将添加到 .zpaq 归档中。您也可以使用通配符,例如 *?(通常在 Windows 上)来匹配多个文件。

因为文件或文件夹列表是用空格分隔的,所以您需要使用引号 (") 来括住包含空格的路径。

示例:

  • 像这样归档多个文件夹:
zpaqfranz a d:\thebackup.zpaq c:\dati c:\user z:\mysql

此命令将归档三个不同的文件夹(c:\dati、c:\user 和 z:\mysql)。

在这种情况下,文件夹名称中没有空格,因此不需要使用引号。

但是,如果您想包含路径中包含空格的文件夹,例如 "C:\Documents and Settings",您必须使用引号:

zpaqfranz a d:\thebackup.zpaq "C:\Documents and Settings"

关键要点:

  • 路径中没有空格:无需引号。

  • 路径中包含空格:始终将路径用引号括起来。

额外提示:在 *nix 系统上使用双引号!### 2) 同时添加文件夹和单个文件

是的,真的!

要添加的项目列表可以包含文件夹和单个文件。您不仅限于备份整个目录——您也可以直接指定单个文件。

zpaqfranz a d:\thebackup.zpaq c:\zpaqfranz\zpaqfranz.cpp

灵活性

  • 单个文件或多个文件:直接指定单个文件。

  • 混合列表:在同一个命令中组合文件和文件夹。

3) 高级选择选项

事实上,zpaqfranz 提供了许多额外的方法,可以根据各种标准(例如文件扩展名大小等)来选择和取消选择文件。但是,我们暂时不会深入探讨这些复杂性。

建议:

  • 我鼓励您亲自尝试使用该工具。您会发现,最终它并不像初看起来那么复杂。

  • 练习:尝试不同的命令和选项,以了解 zpaqfranz 的操作方式。这种实践经验将有助于巩固您的理解。

花时间探索,您将发现 zpaqfranz 提供的全部功能,使其成为满足您备份需求的强大工具。

Voodoo 压缩 ## 压缩魔法 (Voodoo compression)

ZPAQ 的开发者(Matt Mahoney 博士 http://mattmahoney.net/dc/zpaq.html)是一位世界级的压缩专家,他在 ZPAQ 中实现了许多参数,为了简单起见,我称之为“魔法”。如果您不知道我们在说什么...别担心,这很正常。

简短版本:

  • -m0 = 无压缩(仅去重),用于加密容器,例如 TrueCrypt, VMDHx, MP4, MKV 等。

  • -m1 = 默认。快速且不占用太多 RAM。强烈推荐,例如 vmdk。

  • -m2 = 比 -m1 更好的压缩,速度较慢,占用更多 RAM。用于 DOC, XLS 等。压缩速度较慢,但解压速度与 -m1 一样快。推荐用于一次压缩多次解压的归档,例如下载文件。

  • -m3 = 良好的压缩,但需要大量 RAM。

  • -m4 = 非常好的压缩,需要巨大的 RAM。

  • -m5 = 安慰剂级别,对于实际使用来说太慢且占用太多 RAM。

作者的原始 PDF

-mtype[Blocksize[.pre[.arg][comp[.arg]]...]] -method type[Blocksize[.pre[.arg][comp[.arg]]...]] 使用 add 时,选择一种压缩方法。type 可以是 0, 1, 2, 3, 4, 5, x, 或 s。可选的 Blocksize 可以是 0..11,写在 type 后面,中间没有空格,例如 -m10 或 -method 511。剩余的参数,用点或逗号分隔,中间没有空格,只允许用于 type x 或 s,例如 -mx4.3ci1。

如果 type 是数字,则数字越大压缩越好,但速度越慢。

Blocksize 表示将片段打包到最大 2^Blocksize MiB 的块中。使用更大的块可以提高压缩率,但需要更多内存,并且可能更慢,因为每个块由单独的线程压缩或解压。内存需求对于级别 4 及以下,每个线程最多需要 8 倍 Blocksize 的内存;对于级别 5,每个线程需要 16 倍 Blocksize 的内存。默认 Blocksize 对于 type 0 和 1 是 4 (16 MiB),其他情况下是 6 (64 MiB)。

Type x 和 s 用于实验。通常,zpaq 根据压缩级别和数据分析(文本、可执行文件或其他二进制文件,以及可压缩程度)选择不同的方法。type 选择日志记录或流式格式。pre 是 0..7,选择预处理步骤 (LZ77, BWT, E8E9),comp 是一系列上下文建模组件,从集合 {c,i,a,w,m,s,t} 中选择,分别选择 CM 或 ICM, ISSE 链, MATCH, 词模型, MIX, SSE, 或 MIX2。pre 和 comp 后面可以跟一个用点或逗号分隔的数字参数列表 (arg)。例如:

-method x6.3ci1 选择日志记录归档 (x),块大小 2^6 = 64 MiB,BWT 变换 (3),一个 0 阶 ICM (c),和一个 1 阶 ISSE (i1)。(zpaq 通常在级别 3 文本压缩时选择此方法)。type 如下。

x 选择正常(日志记录)模式。文件被分割成片段,去重,打包成块,并按所述方法压缩。压缩块前面有一个事务头,给出更新日期。块后面是片段哈希和大小列表,以及添加、更新或删除的文件列表。每个添加或更新的文件列出最后修改日期、属性和片段 ID 列表。

s 选择流式模式,用于单次提取和与 6.00 (2012) 之前的 zpaq 版本兼容。流式归档不支持去重或回滚。文件被分割成大小为 2^blocksize MiB - 4 KiB 的片段。每个文件或片段在一个单独的块中压缩,不尝试去重。文件名、日期和属性存储在第一个片段的头部。哈希值存储在每个块的尾部。没有事务块来允许回滚。文件被添加到先前日期的更新中。流式模式与 -index 一起使用会出错。

强烈不推荐

pre[.min1.min2.depth.size[.lookahead]] pre 选择上下文建模之前的预处理/后处理步骤,如下所示。

0 = 无预处理 1 = 打包 LZ77 2 = 字节对齐 LZ77 3 = BWT (Burrows-Wheeler 变换) 4 = E8E9 5 = E8E9 + 打包 LZ77 6 = E8E9 + 字节对齐 LZ77 7 = E8E9 + BWT E8E9 变换 (4..7) 提高了 x86 可执行文件(.exe 或 .dll)的压缩率。变换向后扫描 5 字节模式,形式为 (E8|E9 xx xx xx 00|FF) 十六进制,并将块偏移量添加到中间三个字节。E8 和 E9 操作码分别是 CALL 和 JMP。变换将相对地址替换为绝对地址。变换在 LZ77 或 BWT 之前应用。解压时按相反顺序反转变换。

LZ77 (1, 2, 5, 6) 通过使用哈希表或后缀数组搜索匹配字符串,并用指向先前匹配的指针替换它们来进行压缩。Type 1 和 2 分别选择可变位长编码或字节对齐编码。可变位长编码本身压缩更好,但字节对齐编码允许使用上下文模型进一步压缩。Type 6 和 7 分别与 1 和 2 相同,只是先进行 E8E9 变换。

BWT (Burrows Wheeler 变换, 3 或 7) 按上下文对输入块进行排序,这将具有相似上下文的字节聚集在一起。它本身不进行压缩,但使输入适合使用快速自适应低阶上下文模型进行压缩。

剩余的参数仅适用于 LZ77。min1 选择最小匹配长度,打包 LZ77 至少为 4,字节对齐 LZ77 至少为 1。min2 选择一个更长的最小匹配长度优先尝试,或为 0 跳过此步骤。块通过测试 2^depth 个位置进行编码,这些位置由 2^size 个元素的哈希表索引,哈希表由下一个 min2 和 min1 字符的哈希值索引。如果指定了 lookahead 且大于 0,则搜索重复 lookahead + 1 次,以将接下来的 0 到 lookahead 字节视为字面值,以找到更长的匹配。

如果 size = blocksize + 21,则使用后缀数组而不是哈希表查找匹配,向前和向后扫描 2^depth 个元素以找到最长的先前匹配。min2 无效。后缀数组需要 4.5 x 2^blocksize MiB 内存。哈希表需要 4 x 2^size 字节内存。例如:

-method x6.1.4.0.5.27.1 指定 64 MiB 块 (6),不带 E8E9 的可变长度 LZ77 (1),最小匹配长度 4,无二次搜索 (0),后缀数组搜索中每个方向的搜索深度 2^5 = 32 (27 = 6 + 21),以及 1 字节 lookahead。

comp 指定上下文模型的一个组件。如果此部分为空,则不执行进一步压缩。否则,块由组件数组压缩。每个组件接收一个上下文以及可能来自先前组件的输出,并输出一个预测,即下一个输入位为 1 的概率。最终预测用于算术编码该位。组件通常分配等于块大小的内存,或根据需要为较小的上下文分配较少的内存。组件如下:

c[.maxcount[.offset[.mask]...]] 指定上下文模型 (CM) 或间接上下文模型 (ICM)。CM 将上下文哈希映射到预测,通过在表中查找上下文,然后调整预测以减少编码误差,调整量为 1/count,其中 count 受 maxcount x 4 限制,maxcount 在 1..255 之间。

如果 maxcount 为 0,则指定 ICM。ICM 将上下文映射到表示两个位计数和最新位的状态。该状态被映射到预测并以固定速率更新。ICM 对变化统计信息的适应速度更快。具有高 count 的 CM 更好地压缩静态数据。默认值为 0 (ICM)。

如果 maxcount 的形式为 1000m + n,则效果与 maxcount = n 相同,同时内存减少到块大小的 1/2^m。

剩余的参数表示上下文,所有这些上下文一起进行哈希。如果 offset 是 1..255,则块偏移量模 offset 进行哈希。如果 offset 是 1000..1255,则到 offset - 1000 最后一次出现的距离进行哈希。例如,c0.1010 指定一个 ICM,将文本列号(到最后换行符的距离 = 10)作为上下文。默认值为 0(无上下文)。

每个 mask 与先前字节进行 AND 运算。例如,c0.0.255.255.255 是一个具有 3 阶上下文的 ICM。256..511 的值指定一个上下文,即 mask - 256 与字节对齐 LZ77 解析状态(是否期望字面值或匹配代码)一起哈希。例如,-method x6.2.12.0.8.27c0.0.511.255 指定块大小 2^6 MiB,字节对齐 LZ77 (2),最小匹配长度 12,搜索深度 2^8,后缀数组搜索 (27 = 6 + 21),一个 ICM (c0),无偏移量上下文 (0),以及 2 阶上下文加上 LZ77 状态 (511.255)。

大于 1000 的 mask 是 mask - 1000 个零的简写。例如,稀疏上下文 c0.0.255.1003.255 等效于 c0.0.255.0.0.0.255。

m[size[.rate]] 指定一个 MIX(混合器)。MIX 计算所有先前组件预测的加权平均值。(平均在逻辑域进行:log(p / (1 - p)))。然后根据 rate (0..255) 调整权重,以减少预测误差。可以使用 size 位上下文来选择一组要使用的权重。上下文的前 8 位是当前字节先前编码的位。默认值为 m8.24。具有 n 个输入的 MIX 需要 4n x 2^size 字节内存。

t[size[.rate]] 指定一个 MIX2。MIX2 类似于 MIX,但它只接受最后 2 个组件作为输入,并且其权重被限制为总和为 1。MIX2 需要 4 x 2^size 字节内存。默认值为 t8.24。

s[size[.mincount[.maxcount]]] 指定一个 SSE(二级符号估计器)。SSE 接收最后 size 位上下文和先前组件的量化插值预测作为输入,并输出调整后的预测。调整输出以减少预测误差,调整量为 1/count,其中 count 限制在 mincount 和 4 x maxcount 之间。默认值为 s8.32.255。

iorder[.increment]... 指定 ISSE(间接二级符号估计器)链。ISSE 通过将其与常数 1 混合来调整先前组件的预测。一对混合权重由位历史状态选择(类似于 ICM)。位历史由最后 order 个字节的哈希以及先前组件上下文的哈希选择。每个 increment 指定一个额外的 ISSE,其上下文阶数增加 increment。例如,ci1.1.2 指定一个 0 阶 ICM 和 1、2 和 4 阶 ISSE。

w[order[.A[.Z[.cap[.mul[.mem]]]]]] 指定一个长度为 order 的 ICM-ISSE 链,将最后 1、2、3...、order 个完整词的哈希作为上下文。词定义为范围 A 到 A + Z - 1 中的字符序列,在哈希之前与 cap 进行 AND 运算。哈希 H 通过字节 c 更新为 H := (H x mul + c) (mod 2^(blocksize + 24 - mem))。每个组件需要 2^(blocksize - mem) MiB。默认值为 w1.65.26.223.20.0,它将词定义为 65..90 (A..Z)。与 223 进行 AND 运算在哈希之前转换为大写。mul = 20 的效果是左移 2 位。对于典型的块大小(28 或 30 位 H),词哈希取决于最后 14 或 15 个字母。

a[mul[.bmem][.hmem]]] 指定一个 MATCH。MATCH 搜索过去的匹配上下文,并预测接下来的位。搜索通过将上下文哈希 H 与字节 c 更新为 H := H x mul + c (mod 2^(blocksize + 18 - hmem)) 来完成。MATCH 使用 2^(blocksize - bmem) MiB 历史缓冲区和一个 2^(blocksize - hmem) MiB 哈希表。默认值为 a24.0.0。如果 blocksize 为 6,则 H 为 24 位。mul = 24 左移 4 位,使上下文哈希有效阶数为 6。

非常简短的版本:保留默认设置 😃

Voodoo 重复数据删除 *zpaq 使用了一种相当高级的去重方法。它不是世界上最有效的,但可靠且(相对)内存占用较低。基于 SHA-1 的方法会静默地受到 SHA-1 碰撞的影响。zpaqfranz 会检测到这些情况。*

-fragment N

设置去重片段大小范围从 64 * 2^N 到 8128 * 2^N 字节,平均大小为 1024 * 2^N 字节。默认值为 6(范围 4096..520192,平均 65536)。较小的片段大小可以通过相似文件的去重提高压缩率,但需要更多内存和更多开销。每个片段会给归档增加约 28 字节,并需要约 40 字节内存。对于默认设置,这小于归档大小的 0.1%。

除 6 以外的值符合 ZPAQ 规范,并且所有版本都可以正确解压,但不符合最佳去重的建议。使用不同的 N 值添加相同的文件不会去重,因为片段边界会不同。出于同样的原因,list -summary 也不会将这些文件识别为相同。

非常简短的版本:保留默认设置 😃

Voodoo 双引号 # 使用双引号的提示,尤其是在 \*nix 系统上!

尤其是在使用通配符,例如 * 和 ? 时。

一些示例

  • 正确 zpaqfranz a "/tmp/test_???" /whatever -only "*.cpp"

  • 正确 zfsadd /tmp/kong.zpaq "tank/d@2021" "--60d"

  • 正确 "test_????.zpaq"

  • 错误 test_????.zpaq

  • 正确 "\*francia\*"

  • 错误 \*francia\*

  • 警告 在 Windows 上可以,但在 Linux 上不行 zpaqfranz a z:\test_??? * -only *.cpp

卢克,除了使用原力,还要使用双引号!

翻译

在命令行输入字符串时,Windows 和 *nix 之间存在差异。

在 *nix 上,通配符的“展开”通常在程序启动之前发生。

这是因为相关的 shell(bash 等)会处理参数,并在参数已经展开后将其传递给程序(本例中是 zpaqfranz)。 将字符括在双引号中会保留引号内所有字符的字面值,除了 $, `, \。

实际上,情况要复杂得多,但我不想深入太多细节。

然而,在 Windows 中,参数会按原样传递给程序。

因此,有时您在 *nix 上像在 Windows 上那样输入命令, 会得到不同的结果,甚至错误的结果。

zpaqfranz 内部有一些启发式方法,可以使某些命令在 *nix 上以与 Windows 相同的逻辑运行,但这是部分实现的,正是因为参数在 *nix 上是“预消化”后才传递的。

Voodoo 加密 *几乎在任何地方,您都可以使用以下方式输入密码:*

-key password

此选项对于所有操作加密归档的命令都是必需的。使用 add 创建新归档时,新归档将使用 password 进行加密,并且所有后续操作都需要相同的 password。

归档使用 AES-256 在 CTR 模式下加密。密码通过 Scrypt(SHA-256(password), salt, N=16384, r=8, p=1) 进行增强,这在暴力破解密钥搜索中每次测试需要 208M 次操作和 16 MB 内存。创建新归档时,在 Windows 中使用 CryptGenRandom() 或在 Unix/Linux 中使用 /dev/urandom 生成一个 32 字节的 salt,使得第一个字节与未加密归档的正常头部(z 或 7)不同。多卷归档使用单个密钥流加密,如同将各部分连接起来一样。索引使用相同的密码加密,其中 salt 的第一个字节通过与 ('z' XOR '7') 进行 XOR 运算修改。

加密提供保密性,但不提供身份验证。知道或可以猜测明文任何位的攻击者可以在不知道密钥的情况下设置它们。

提示:最好使用一个长密码,而不是一个短的“奇怪”密码

!Ab1 的搜索空间约为 ~8 x 10^7 betterlongthanshort 约为 ~8 x 10^26