архивирование файлов с одинаковыми именами в разных папках с помощью функции 7z @listfile

Я хочу создать файл 7zip, содержащий файлы с одинаковыми именами, но в разных папках, используя функцию 7zip @listfile. Хотя я уже давно использую 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 [email protected] my_compressed_file.7z

Затем, учитывая пояснения в файле справки Windows CHM 7zip по синтаксису, я также попытался включить корневую папку (называемую «файлами»):

7z a [email protected] my_compressed_file.7z .\files

Я получаю ту же ошибку в обоих случаях:

Error
Duplicate filename:
somefile1.html
somefile2.html

Кто-нибудь понял это и хотел бы пролить свет на это?

Я знаю, как сжать файлы с одинаковыми именами в разных папках иначе (когда структура папок сохраняется в 7zip, это не проблема). Но на этот раз несколько файлов, которые мне нужны, разбросаны повсюду...


person jockster    schedule 01.10.2012    source источник
comment
Это была ОГРОМНАЯ ошибка в 7zip на протяжении многих лет. Об этом много раз сообщали авторам 7zip... но они, кажется, просто не понимают этого. Я избегаю 7zip.   -  person Gayle    schedule 23.03.2013


Ответы (5)


Следующие команды для Windows с использованием оболочки и 7za (версия 7zip для командной строки), вероятно, могут быть адаптированы для других платформ; но это решило проблему для меня:

1) Составьте список всех файлов, которые вы хотите заархивировать, включая полные пути, с помощью следующей команды; предположим, что ваша командная строка находится в каталоге C:\, и вы хотите вывести список всех файлов *.xmp во всех подкаталогах на диске C: для архивирования на следующем шаге:

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

2) Используйте XMPsToArchiveList.txt в качестве файла списка для 7za с ключом -spf, который указывает 7za «использовать полные пути к файлам:»

7za a -spf [email protected] allCdriveXMPs.7z

Если все пойдет хорошо, вы должны получить радостное сообщение: «Все в порядке» и увидеть новый и правильный так называемый архив .7z.

В моем тесте полученный архив .7z имеет папки и подпапки, отражающие полные пути ко всем файлам .xmp, с корневой папкой под названием «C:».

ЗАМЕТКИ:

A) В Windows, чтобы адаптировать команду списка для включения всего в такое количество каталогов с заданным именем (в очень многих разных местах), вы можете использовать, например:

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

Б) Переключатель -spf был добавлен 16 сентября 2011 г.; re: http://www.7-zip.org/history.txt

Кроме того, я пробовал использовать подстановочные знаки, пытаясь создать список, как вы описываете, но мне не удалось получить все файлы с именами, например. somefile*.txt в список (например, archiveTheseFiles.txt). Может я неправильно написал? Кажется простым. Вам нужно будет возиться с подсказкой, чтобы найти то, что работает для вас.

Наконец, я не знаю, доступен ли переключатель -spf для 7z (в отличие от 7za). 7za доступен там же, в разделе «Дополнения»: http://www.7-zip.org/download.html

person Alex Hall    schedule 10.01.2016
comment
Спасибо за действительно полезную информацию о командной строке 7z. Пометка вашего поста как ответа. Это решило связанную с этим проблему, с которой я столкнулся при архивировании измененных файлов с неповрежденной структурой каталогов для целей резервного копирования. Первоначальная проблема тоже была решена - просто подтвердил это. Спасибо! - person jockster; 09.12.2016
comment
Вы можете использовать PowerShell для создания файла списка и сохранения относительных путей вместо абсолютного пути: ls *.xmp -Recurse | Resolve-Path -Relative | %{$_.Substring(2)} | ac XMPsToArchiveList.txt - person Gregor y; 21.06.2018

Я столкнулся с той же ошибкой (повторяющееся имя файла) при использовании файла списка. Мой файл списка выглядел так:

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

Я решил проблему, запустив 7-zip из D:\ и отредактировав файл списка, чтобы использовать относительные, а не абсолютные пути:

SomeDir\SomeFile.txt
SomeOtherDir\SomeFile.txt

Полученный архив сохранил исходную структуру каталогов и выглядел именно так, как я ожидал.

Примечание. Я использовал 7-Zip 4.65, и это решение не будет работать, если файлы находятся на разных дисках или имеют другой корень.

Командная строка PowerShell, которую я запускал, была:

& 'C:\Program Files\7-Zip\7z.exe' a -scsWIN logs.7z `@recentlogs.txt
person bart    schedule 06.05.2013
comment
Именно то, что мне нужно, чтобы упаковать вещи с абсолютными путями, спасибо. :) - person Adambean; 30.04.2014
comment
Это работает, просто не забудьте обрезать все начальные символы пути ('\'). - person Derf Skren; 12.12.2014
comment
Когда я хочу сохранить проект, над которым работаю (например, я сейчас в середине одного из них, где я опробовал несколько разных тактик, я остановился на одном, и я собираюсь чтобы убрать весь остальной код, но я хочу заархивировать его с кодом-как-примерами) - мой проект называется Зеркало (в папке Зеркало в 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 представляет собой список конкретных файлов, которые я хочу резервное копирование.) - person Steve Greene; 29.11.2015

Моя реальная структура каталогов была:

+---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 [email protected]

Это вызвало ошибку дублирования. Без "-r" ошибки нет.

Попробуйте проверить командную строку на наличие рекурсивного сканирования и списка файлов, если на самом деле нет двух файлов с одинаковым целевым путем (использование «.» в пути к файлу удаляет путь в выводе).

person Julo    schedule 09.12.2013
comment
Эта функция действительно нуждается в добавлении в документацию 7-zip. - person Gregor y; 21.06.2018

Поскольку 7z содержит ошибки, если вы настаиваете на использовании 7z для сжатия, попробуйте использовать tar, чтобы сначала создать архив .tar, а затем создать архив .tar.7z.

person tarinstead    schedule 20.09.2014
comment
учитывая, что в вопросе упоминается файл справки Windows, у них может не быть tar. - person combinatorial; 21.09.2014

Начиная с бета-версии 7-zip 9.38 вы можете выбрать режим пути: относительный, полный, абсолютный.

person denfromufa    schedule 04.02.2015
comment
@AlexHall это только опция графического интерфейса в диалоговом окне «Добавить в архив». - person denfromufa; 12.01.2016