如何使用 7-Zip 命令行归档子目录?或者,我如何在归档时保持文件夹结构?

Pri*_*ulz 17 command-line 7-zip

我有一堆这样的文件:

C:\G\G1\35antique-shop.mp3
C:\G\G2\35antique-shop.mp3
C:\G\G1\09saguri.mp3
C:\G\G2\09saguri.mp3
Run Code Online (Sandbox Code Playgroud)

我只想知道如何在归档时保持文件夹结构。这比重复的事情更重要,知道如何解决这个问题,将是一个奖励。

@Lamb“您是否只想存档 G1 和 G2 文件夹中的选择性文件(而不是整个文件夹内容)?”

这几乎说明了一切,但我会尝试改进:我不仅只想某些选定的文件移动到存档中。我还有这些文件的列表,包括每个文件的路径名。

因此,在 SubDir1 中可能有 10 个文件,我想压缩其中的三个,而在 SubDir1\sub2 中可能有五个文件,我想压缩所有五个文件。我需要存档的文件在一个列表文件中。

可能存在重复文件,所以我希望添加子目录后,7-Zip 不会将它们视为重复文件。

而且我喜欢在命令行上执行此操作。

我试过这样的批处理文件:

7z a -r MyArchive.7z C:\G\G1\35antique-shop.mp3
7z a -r MyArchive.7z C:\G\G2\35antique-shop.mp3
7z a -r MyArchive.7z C:\G\G1\09saguri.mp3
7z a -r MyArchive.7z C:\G\G2\09saguri.mp3
Run Code Online (Sandbox Code Playgroud)

这也意味着文件 01antique-shop.mp3、02antique-shop.mp3、....、直到 33antique-shop.mp3 和 34antique-shop.mp3 不应存档。

文件夹名称(=子目录)未添加到 MyArchive.7z,这就是问题所在。

显然,我只想使用一个带有列表文件的突击队,但这也不起作用。

我试过了:

7z a -mx0 -tzip C:\$$-edrive\F-G-H.zip @fgh.txt
Run Code Online (Sandbox Code Playgroud)

就选择而言,它实际上工作得很好,但它不保留目录结构。可悲。

我该怎么做呢?

小智 14

7-Zip (15.14) 的最新稳定版本具有启用绝对路径存储的开关 -spf。

例如,如果文件list.txt

C:\tmp\dir1\file.txt
C:\tmp\dir2\file.txt
Run Code Online (Sandbox Code Playgroud)

该命令7z a p.7z -spf @list.txt将生成一个存档,存储列表中的绝对路径。或者,该命令7z a p.7z -spf2 @list.txt将删除驱动器号:

tmp\dir1\file.txt
tmp\dir2\file.txt
Run Code Online (Sandbox Code Playgroud)

如果文件list.txt

dir1\file.txt
dir2\file.txt
Run Code Online (Sandbox Code Playgroud)

该命令7z a p.7z @list.txt将在 9.20 和 15.14 版本中按原样存储列表中的相对路径。

我用开关 -spf 做了更多的测试。结果在这里


Eri*_*per 9

我得到它使用以下命令归档一个带有子目录的目录:

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
Run Code Online (Sandbox Code Playgroud)


Kar*_*ran 7

试试这个:

cd /d C:\
7z a MyArchive.7z G\G1\35antique-shop.mp3
7z a MyArchive.7z G\G2\35antique-shop.mp3
7z a MyArchive.7z G\G1\09saguri.mp3
7z a MyArchive.7z G\G2\09saguri.mp3
Run Code Online (Sandbox Code Playgroud)

这个问题似乎是,人们已经请求多年来为正确的路径存储选项(就像他们对于修改多卷档案的能力),但作者似乎并不感兴趣。这就是我开始大量使用 WinRAR 的部分原因。


如果您有一个列表文件,并且要存档的文件不共享单个顶级目录,则 7-Zip 将不会存储路径。例如,如果您的Input.txt包含以下内容:

C:\path to\file1.ext
D:\path to\file1.ext
E:\path to\file1.ext
Run Code Online (Sandbox Code Playgroud)

如果您运行7z a MyArchive.7z @Input.txt,您会看到路径已被完全剥离,这对我来说似乎完全相反(OTOHrar a MyArchive.rar @Input.txt可以很好地完成这项工作)。

因此,为了克服 7-Zip 的不足,您可以使用如下批处理文件:

for /f "tokens=1* delims=\" %%i in (Input.txt) do (
    pushd %%i\
    7z a D:\MyArchive.7z "%%j"
    popd
)
Run Code Online (Sandbox Code Playgroud)

注意:替换D:\MyArchive.7z为目标存档的正确路径。此外,无论您是否在列表文件中引用了路径,批处理文件都应该工作。


编辑:如果您的列表文件如下所示:

"C:\$$-edrive\F\faithless.-.long.way.mp3"
"C:\$$-edrive\G\Antique Shop.mp3"
Run Code Online (Sandbox Code Playgroud)

或者

"\$$-edrive\F\faithless.-.long.way.mp3"
"\$$-edrive\G\Antique Shop.mp3"
Run Code Online (Sandbox Code Playgroud)

然后将其编辑为如下所示:

"$$-edrive\F\faithless.-.long.way.mp3"
"$$-edrive\G\Antique Shop.mp3"
Run Code Online (Sandbox Code Playgroud)

现在假设所有要归档的文件都在 下C:\$$-edrive,导航到 C:\ 并运行7z a C:\MyArchive.7z @C:\Input.txt。使用列表文件,只有在没有驱动器号、没有初始反斜杠并且所有文件的顶级(根)目录都相同时,才会保存路径。此外,为了获得最佳效果,我建议您不要在 C:\$$-edrive 中创建 MyArchive.7z。


MT_*_*ead 0

无论如何,7-Zip 都会将它们视为重复项,并跳过它们。如果有什么办法可以解决这个问题,我从来没有找到过——我总是把工作分成几个档案。