Windows 1803、7z 18.05
尝试存档和压缩具有多个 NTFS 连接点且引用该结构各部分(即没有“外部”链接)的文件夹结构 - 是否有可能在 7zip 不解析连接点的情况下压缩该结构,从而导致重复?
保留连接点会很整洁,将连接点存档为空文件夹也是可以接受的 - 但存档大小具有绝对优先权。
选择tar
或wim
作为格式有关于 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
我建议分两个步骤进行:
- 生成文件夹中所有连接点的列表
- 从文件夹中创建一个 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]