14

我想使用 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 中时,没问题)。但是这一次我需要的几个文件遍布各处......

4

5 回答 5

7

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

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
于 2013-05-06T00:59:41.330 回答
7

以下用于 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

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

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

于 2016-01-10T06:33:33.000 回答
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”就没有错误。

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

于 2013-12-09T14:22:13.833 回答
2

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

于 2014-09-20T23:31:46.200 回答
1

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

于 2015-02-04T16:50:36.550 回答