11

У меня есть куча таких файлов:

C:\G\G1\35antique-shop.mp3
C:\G\G2\35antique-shop.mp3
C:\G\G1\09saguri.mp3
C:\G\G2\09saguri.mp3

Я просто хочу знать, как сохранить структуру папок при архивировании. Это важнее, чем дублирование, знать, как решить эту проблему, было бы бонусом.

@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

Это также означает, что файлы 01antique-shop.mp3, 02antique-shop.mp3, ...., til 33antique-shop.mp3 и 34antique-shop.mp3 НЕ должны архивироваться.

Foldernames (= подкаталоги) не были добавлены в MyArchive.7z, и это проблема.

Очевидно, я хотел бы использовать только один коммандос со списком файлов, но это тоже не работает.

Я пробовал:

7z a -mx0 -tzip C:\$$-edrive\F-G-H.zip @fgh.txt

который на самом деле работает довольно хорошо, поскольку выбор идет, но он НЕ сохраняет структуру каталогов. К сожалению.

Как мне это сделать?

6 ответов6

8

Я получил его, чтобы заархивировать каталог с подкаталогами, используя следующее:

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
8

В последней стабильной версии 7-Zip (15.14) есть ключ -spf, который позволяет хранить данные по абсолютному пути.

Например, если файл list.txt

C:\tmp\dir1\file.txt
C:\tmp\dir2\file.txt

команда 7z a p.7z -spf @list.txt создаст архив, хранящий абсолютные пути, как в списке. Кроме того, команда 7z a p.7z -spf2 @list.txt удалит букву диска:

tmp\dir1\file.txt
tmp\dir2\file.txt

Если файл list.txt

dir1\file.txt
dir2\file.txt

команда 7z a p.7z @list.txt сохранит относительные пути, как есть в списке, в обеих версиях 9.20 и 15.14.

Я сделал больше тестов с ключом -spf. Результаты здесь.

6

Попробуйте это вместо этого:

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

Проблема , кажется, что люди запрашивали в течение многих лет для соответствующих вариантов хранения пути (так же , как они есть на возможность изменять многотомные архивы), но автор , кажется, не заинтересовано. Это одна из причин, почему я так много начал использовать WinRAR.


Если у вас есть файл списка, 7-Zip не будет хранить пути, если файлы, которые нужно заархивировать, не используют один каталог верхнего уровня. Например, если у вас есть Input.txt, содержащий следующее:

C:\path to\file1.ext
D:\path to\file1.ext
E:\path to\file1.ext

Если вы запустите 7z a MyArchive.7z @Input.txt , вы увидите, что пути были полностью удалены, что мне кажется совершенно обратным (OTOH rar 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
)

Примечание. Замените D:\MyArchive.7z на правильный путь к вашему целевому архиву. Кроме того, пакетный файл должен работать независимо от того, указали ли вы пути в кавычках в вашем файле списка или нет.


Изменить: если ваш список файлов выглядит так:

"C:\$$-edrive\F\faithless.-.long.way.mp3"
"C:\$$-edrive\G\Antique Shop.mp3"

или же

"\$$-edrive\F\faithless.-.long.way.mp3"
"\$$-edrive\G\Antique Shop.mp3"

затем отредактируйте его так, чтобы он выглядел так:

"$$-edrive\F\faithless.-.long.way.mp3"
"$$-edrive\G\Antique Shop.mp3"

Теперь предположим, что все файлы, подлежащие архивированию, находятся в C:\$$-edrive , перейдите к C:\ и запустите 7z a C:\MyArchive.7z @C:\Input.txt . При использовании файла списка пути будут сохранены только в том случае, если буквы дисков отсутствуют, начальная обратная косая черта отсутствует и если каталог верхнего уровня (корневой) одинаков для всех файлов. Кроме того, для достижения наилучших результатов я советую вам не создавать MyArchive.7z в C:\ $$ - edrive.

0

Не уверен, как помочь с дубликатами. Тем не менее, я думаю, что более удобной системой, чем пакет с полной командой, было бы создание listfile.txt:

 C:\G\G1\35antique-shop.mp3
 C:\G\G2\35antique-shop.mp3
 MyArchive.7z C:\G\G1\09saguri.mp3
 MyArchive.7z C:\G\G2\09saguri.mp3

А затем сожмите их все с помощью 7z a -r -tzip archive.zip @listfile.txt

0

Я создал скрипт для использования с totalcmd "tot-zip.bat":

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set "TOP_DIR="D:\Grabovsky""
set "archname="%TOP_DIR%\arch.zip""
set "filelist= "
cd %TOP_DIR%
for %%A in (%*) do (
    set ondisk_path="%%~dpnxA"
    set inarch_path=!ondisk_path:%TOP_DIR%\=!
    echo Putting !ondisk_path! to !inarch_path!.
    set "filelist=!filelist! !inarch_path!"
)
echo filelist: %filelist%

7z.exe a -tzip %archname% %filelist% > NUL
pause

Затем в totalcmd создайте для него ярлык:

Затем, когда вы хотите сжать некоторые файлы / папки и сохранить структуру папок относительно %TOP_DIR% вы просто выбираете нужные файлы (где-то внутри %TOP_DIR%) и нажимаете кнопку.

0

7-Zip будет видеть их как дубликаты, и пропустить их. Если есть какой-то способ обойти это, я никогда не нашел его - я всегда просто делю работу на несколько архивов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .