【问题标题】:zipping files with the same name in different folders using 7z @listfile feature使用 7z @listfile 功能在不同文件夹中压缩同名文件
【发布时间】:2021-10-26 17:47:46
【问题描述】:

我想使用 7zip 的 @listfile 功能创建一个包含名称相同但位于不同文件夹中的文件的 7zip 文件。尽管我已经使用 7zip CLI 很长时间了,但我只是找不到完成此操作的语法。

我的文件树看起来像这样(注意 somefile1.html 和 somefile2.html 各出现两次)。

|   somefile2.html
+---dir1
|       somefile1.html
|       somefile2.html
|       
+---dir2
|       somefile3.html
|       somefile4.html
|       
\---dir3
        somefile1.html
        somefile5.html

使用@listfile 可以正常工作,但我不知道如何在生成的 7zip 中保留目录树。

我尝试了以下语法:

7z a -ir@files.txt my_compressed_file.7z

然后,鉴于 7zip 的 Windows CHM 帮助文件中的语法解释,我也尝试包含根文件夹(称为“文件”):

7z a -ir@files.txt my_compressed_file.7z .\files

在这两种情况下我都会遇到同样的错误:

Error
Duplicate filename:
somefile1.html
somefile2.html

有没有人想出这个并愿意解释一下?

我知道如何在不同的文件夹中压缩具有相同名称的文件,否则(当文件夹结构保留在 7zip 中时没问题)。但这一次我需要的几份文件却遍布各处……

【问题讨论】:

  • 多年来,这一直是 7zip 中的一个巨大错误。 7zip 的作者曾多次报告过它……但他们似乎并不理解它。我避免使用 7zip。

标签: directory compression duplicates 7zip


【解决方案1】:

以下用于 Windows 的命令,使用 shell 和 7za(7zip 的命令行版本)可能适用于其他平台;但这为我解决了问题:

1) 使用如下命令列出您要归档的所有文件,包括完整路径;假设您的命令提示符位于 C:\ 目录中,并且您希望列出 C: 驱动器上所有子目录中的所有 *.xmp 文件,以便在下一步中归档:

DIR /B /S *.xmp > XMPsToArchiveList.txt

2) 使用 XMPsToArchiveList.txt 作为 7za 的列表文件,带有 -spf 开关,指示 7za “使用完全限定的文件路径:”

7za a -spf -ir@XMPsToArchiveList.txt allCdriveXMPs.7z

如果一切顺利,您应该会收到幸福的消息:“一切正常”,并会看到一个新的、适当的名为 .7z 的存档。

在我的测试中,生成的 .7z 存档包含反映所有 .xmp 文件的完整路径的文件夹和子文件夹,根文件夹标题为“C:”。

注意事项:

A) 在 Windows 上,要调整 list 命令以包含给定名称的这么多目录中的所有内容(在这么多不同的地方),您可以使用例如:

DIR /S /B *_aCertainFolderNameDuplicatedAllOverTheDrive* > foldersToArchive.txt

B) 2011-09-16 添加了 -spf 开关;回复:http://www.7-zip.org/history.txt

此外,我尝试使用通配符来生成您所描述的列表,但没有任何运气可以将所有文件命名为 e.g. somefile*.txt 到一个列表中(例如archiveTheseFiles.txt)。也许我打错了?看起来很简单。您需要根据提示四处寻找适合您的方法。

最后,我不知道 -spf 开关是否可用于 7z(相对于 7za)。 7za 可在那边,在“附加”下载:http://www.7-zip.org/download.html

【讨论】:

  • 感谢您对 7z 命令行的一些真正有用的见解。将您的帖子标记为答案。这解决了我为备份目的而压缩修改后的文件的相关问题,目录结构完好无损。原来的问题也解决了——只是证实了这一点。谢谢!
  • 可以使用PowerShell生成列表文件并保留相对路径而不是绝对路径:ls *.xmp -Recurse | Resolve-Path -Relative | %{$_.Substring(2)} | ac XMPsToArchiveList.txt
【解决方案2】:

我在使用列表文件时遇到了同样的错误(文件名重复)。我的列表文件如下所示:

D:\SomeDir\SomeFile.txt
D:\SomeOtherDir\SomeFile.txt

我通过从 D:\ 启动 7-zip 并编辑我的列表文件以使用相对路径而不是绝对路径来解决问题:

SomeDir\SomeFile.txt
SomeOtherDir\SomeFile.txt

生成的存档保留了原始目录结构,看起来完全符合我的预期。

注意:我使用的是 7-Zip 4.65,如果文件位于不同的驱动器或具有不同的根目录,则此解决方案将不起作用。

我运行的 PowerShell 命令行是:

& 'C:\Program Files\7-Zip\7z.exe' a -scsWIN logs.7z `@recentlogs.txt

【讨论】:

  • 正是我需要用绝对路径打包东西,谢谢。 :)
  • 这行得通,只要记住修剪掉任何前导路径字符('\')。
  • 当我想保存我正在做的一个项目时(例如,我现在正处于一个中间,我尝试了许多不同的策略,我已经解决了一方面,我即将删除所有其他代码,但我想将其与代码作为示例一起存档) - 我的项目称为“镜像”(在 D:\ 的“镜像”文件夹中) prog\csharp): cd \prog\csharp 7za.exe a -t7z D:\prog\archives\csharp_Mirror_20151127.7z @D:\prog\bkp\Mirror\program_Mirror_backuplist.txt -mx=9 -ms=off (" program_Mirror_backuplist.txt”是我要备份的特定文件的列表。)
【解决方案3】:

我真正的目录结构是:

+---Release
|   |   Lib.dll
|   \--- x64
|           Lib.dll
|       
+---Definition_files
|       data_files
|       
+---x64
|       Lib.dll // Copy of the previous file (only to preserve "x64" directory")
\---Documentation
        documentation_files....

我使用了列表文件:

 .\Release\Lib.dll // used ".\" to remove "Release" directory
 Definition_files\data_files
 Documentation\documentation_files
 x64\Lib.dll

命令行:

7z.exe a -mx=9 -mpass=5 -r .\Packgakes\release.zip .@Lib.lst

这导致了重复性错误。没有“-r”就没有错误。

如果确实没有两个具有相同目标路径的文件,请尝试检查命令行以进行递归扫描和文件列表(在文件路径中使用“.”删除输出中的路径)。 p>

【讨论】:

  • 这个功能确实需要添加到 7-zip 文档中。
【解决方案4】:

由于 7z 有问题,如果你坚持使用 7z 进行压缩,请先尝试使用 tar 创建一个 .tar 压缩包,然后再创建一个 .tar.7z 压缩包。

【讨论】:

  • 鉴于问题提到 Windows 帮助文件,他们可能没有 tar。
【解决方案5】:

从 7-zip 9.38 beta 开始,您可以选择路径模式:相对、完整、绝对。

【讨论】:

  • @AlexHall 它只是“添加到存档”对话框窗口中的 GUI 选项
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
相关资源
最近更新 更多