使用7z @listfile功能压缩不同文件夹中相同名称的文件

17

我想使用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帮助文件中的语法说明,我也尝试包括根文件夹(称为“files”):

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

无论哪种情况,我都会得到相同的错误。

Error
Duplicate filename:
somefile1.html
somefile2.html

有人解决了这个问题并愿意分享一下吗?

我知道如何压缩不同文件夹中名称相同的文件(当文件夹结构在7zip中保留时,这没有问题)。但是这次我需要的几个文件散布在各处...


这是7zip多年来的一个巨大漏洞。已经多次向7zip的作者报告过...但他们似乎就是不理解。我避免使用7zip。 - Gayle
5个回答

8

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

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

正是我需要的,可以使用绝对路径打包文件,谢谢。 :) - Adambean
这个是有效的,只需记得修剪掉任何前导路径字符('')。 - Derf Skren
当我想要存储正在进行的项目时(例如,我现在正在进行一个项目,在其中尝试了许多不同的策略,我已经选择了一种,并且即将删除所有其他代码,但我希望将其归档为代码示例)- 我的项目名为“Mirror”(位于D:\ prog \ csharp中的“Mirror”文件夹中):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”是我要备份的特定文件列表。) - Steve Greene

8
以下是针对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上,为了适应列表命令中包含某个给定名称(在许多不同的位置)的所有目录中的所有内容,您可以使用例如:
DIR /S /B *_aCertainFolderNameDuplicatedAllOverTheDrive* > foldersToArchive.txt

B) -spf开关是在2011-09-16添加的;参考:http://www.7-zip.org/history.txt 我还尝试使用通配符来生成像您描述的那样的列表,但是没有成功将所有名为somefile*.txt的文件列入一个列表中(例如archiveTheseFiles.txt)。也许我打错了?看起来很简单。您需要在命令提示符下进行调整以找到适合您的解决方案。
最后,我不知道-spf开关是否适用于7z(而不是7za)。 7za可以在“附加下载”中找到:http://www.7-zip.org/download.html

感谢您提供了关于7z命令行的一些非常有用的见解。我将您的帖子标记为答案。这解决了我在备份目的下对修改文件进行压缩并保持目录结构的相关问题。原始问题也得到了解决-只是确认一下。谢谢! - jockster
你可以使用PowerShell生成列表文件并保留相对路径而不是绝对路径:ls *.xmp -Recurse | Resolve-Path -Relative | %{$_.Substring(2)} | ac XMPsToArchiveList.txt - Gregor y

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",将不会出现重复错误。

请检查命令行是否进行了递归扫描,并列出文件列表,以确定在目标路径中是否真的没有两个相同的文件(在文件路径中使用"."将在输出中移除路径)


这个功能真的需要添加到7-zip文档中。 - Gregor y

2

由于7z存在缺陷,如果您坚持使用7z进行压缩,请尝试使用tar先创建一个.tar归档文件,然后再创建一个.tar.7z归档文件。


由于问题提到了Windows帮助文件,他们可能没有tar。 - combinatorial

1
自从7-zip 9.38 beta版本以来,您可以选择路径模式:相对路径、完整路径、绝对路径。

1
@AlexHall 这只是“添加到存档”对话窗口中的GUI选项。 - denfromufa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接