我想使用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
使用@list文件可以正常工作,但我无法弄清楚如何在生成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中保留文件夹结构时没问题)。但是这次我需要的几个文件遍布整个地方......
答案 0 :(得分:7)
多年来,这在7zip中一直是一个巨大的错误。 7zip的作者已多次报道......但他们似乎并不理解。我避免使用7zip。
答案 1 :(得分:6)
我在使用列表文件时遇到了同样的错误(重复文件名)。我的列表文件如下所示:
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
答案 2 :(得分: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>
答案 3 :(得分:3)
以下命令用于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)-spf开关添加2011-09-16; re:http://www.7-zip.org/history.txt
另外,我尝试使用通配符来尝试生成一个像你描述的列表,但是没有任何运气可以获得所有文件,例如: somefile * .txt到列表中(例如archiveTheseFiles.txt)。也许我输错了?看似简单。你需要在提示符处乱七八糟地找到对你有用的东西。
最后,我不知道-spf开关是否可用于7z(而不是7za)。 7za可以在这些" extras"下载:http://www.7-zip.org/download.html
答案 4 :(得分:2)
由于7z是错误的,如果您坚持使用7z进行压缩,请先尝试使用tar创建.tar存档,然后创建.tar.7z存档。
答案 5 :(得分:0)
自7-zip 9.38 beta以来,您可以选择路径模式:relative,full,absolute。