7zip 强制忽略 NTFS 连接

7zip 强制忽略 NTFS 连接

Windows 1803、7z 18.05

尝试存档和压缩具有多个 NTFS 连接点且引用该结构各部分(即没有“外部”链接)的文件夹结构 - 是否有可能在 7zip 不解析连接点的情况下压缩该结构,从而导致重复?

保留连接点会很整洁,将连接点存档为空文件夹也是可以接受的 - 但存档大小具有绝对优先权。

选择tarwim作为格式有关于 NTFS 符号链接的选项,但似乎不涉及压缩(仅store显示为压缩级别) - 我必须在之后进行压缩,这似乎是一个不必要的中间步骤。

我可以在存档之前删除连接点,但如果可能的话,我宁愿不这样做。

答案1

很明显 7z(使用 20.02 alpha)无法保留连接点。网络上没有提供任何可行的解决方案。通过 7z 创建 WIM 档案似乎可以保留连接点,但稍后解压档案会破坏它们,请使用 Russinovich 的连接点程序进行验证:

连接点“D:\linux\shared\Work\www”

D:\linux\shared\Work\www: JUNCTION

替代名称:c:\program files\internet\proxydomo\html

现在,将文件夹“D:\linux\shared”压缩为 7z 格式的 WIM(TAR 也一样)存档,然后解压,将破坏连接,并将其指向:

D:\linux\shared\Work\www: JUNCTION

打印名称:D:\linux\shared\program files\internet\proxydomo\html

替代名称:D:\linux\shared\program files\internet\proxydomo\html

解决方案?改用 dism:

https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dism-image-management-command-line-options-s14

创建图像:

dism /Capture-Image /ImageFile:D:\Copy\shared.wim /CaptureDir:D:\linux\shared /Name:shared /Compress:fast /Verify

将图像挂载到一个空目录中,然后卸载它(并放弃所有更改 - 另一种方法是/commit更新图像):

dism /mount-image /imagefile:shared.wim /index:1 /mountdir:D:\Copy\Fix\test

dism /unmount-image /mountdir:D:\Copy\Fix\test\ /discard

或者将图像内容提取到一个空目录:

dism /Apply-Image /ImageFile:shared.wim /Index:1 /ApplyDir:D:\Copy\Fix\test /Verify

连接点得到妥善保护。依赖第三方程序根本无法取得积极成果。逻辑决定了这一点。造物主最了解自己的系统。对上帝而言是正确的,也适用于万事万物和所有人。

答案2

我建议分两个步骤进行:

  1. 生成文件夹中所有连接点的列表
  2. 从文件夹中创建一个 7Zip 存档,同时排除列表中的文件。

第一步,您可以在命令提示符中使用以下命令:

dir /AL /S /B your-folder > exclude.txt

在哪里 :

  • /A显示具有特定属性的所有文件,并L指定重新解析点(符号链接和目录连接)
  • /S使命令递归
  • /B仅指定文件名的裸格式。

压缩文件夹时使用 -x(排除文件名)开关

7z a archive.7z folder\ [email protected]

答案3

补充@harrymc 的回答,并回应你的需要“保留连接点会很好,将连接点存档为空文件夹也是可以接受的 - 但存档大小是绝对优先的。”您可以将连接点存储为纯文本文件,然后使用 7zip 压缩,[email protected]如 @harrymc 所建议的那样。这样,您就满足了两个要求,但代价是在连接的同一目标中创建一个“假”的 .junction 文件。

您需要递归跟踪所有连接点,并为每个连接点提取替换名称并将其保存到文件中

for /d /r %%a in (%1\*) do if exist %%a\nul call :storejunction "%%~dpnxa"
goto :eof

:storejunction
set attribs=%~a1
if not "%attribs:~-1%" == "l" goto :eof
for /f "tokens=3*" %%b in ('junction %~s1 ^| find "Substitute Name:"') do set "jname=%%b"
echo %jname% >"%~f1.junction"
goto :eof

答案4

补充 @harrymc 的回答。当我运行命令时dir,我的所有路径都输出为绝对路径。据说,7z-x命令需要相对路径,一开始我无法让它遵守排除列表。-spf向 7z 添加选项告诉它需要绝对路径,之后它按预期工作。

7z a archive.7z folder\ -spf [email protected]

相关内容