Как архивировать с подкаталогами с помощью командной строки 7-Zip? Или как сохранить структуру папок при архивировании?

16

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

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

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

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

PrincessPooleRulz
источник
Вы хотите архивировать только отдельные файлы (не все содержимое папки) из папок G1 и G2?
Ankit

Ответы:

12

В последней стабильной версии 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. Результаты здесь .

Marco
источник
Я искал эту идею в течение дня. благодаря !
Моше Л
9

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

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
Эрик Ропер
источник
Я не могу найти прямую ссылку на 7zA.exe (по вашей ссылке), устарел и заменен 7z.exe?
PrincessPooleRulz
@ user194767: 7za.exe - версия командной строки .
Каран
и я хотел бы использовать это, но я не могу найти что-то подобное на этой странице, 7-zip.org/download.html. Итак, чтобы быть ясным: с «не могу найти прямую ссылку на 7zA.exe нигде» я действительно имел в виду: «Пожалуйста, дайте мне прямую ссылку на это бесплатное программное обеспечение!» Спасибо!
PrincessPooleRulz
1
@ user194767: Хорошо, вот текущая версия, но вы говорите мне, что не можете найти версию 7-Zip для командной строки на этой странице ?!
Каран
Я не мог 7zA.exe, поэтому попытался использовать 7z.exe, и это сработало. Я не уверен, для чего используется флаг -r, но он не нужен для архивирования подкаталогов.
Эрик Ропер
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

Проблема , кажется, что люди запрашивали за годы для соответствующих вариантов хранения пути (так же , как они есть на возможность изменять многотомные архивы ), но автор , кажется, не заинтересованы. Это одна из причин, почему я начал так много использовать 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.

Каран
источник
Ну, ответ был 3/4 хорошо. RAR работал супер, но пакетный файл работал сосо. Вот вывод, и он только добавил в мой архив ОДИН файл, без пробелов в имени файла___ C: \ Programs \ zippers \ 7-Zip> (pushd "C: \ c: \ Programs \ zippers \ 7-Zip \ 7z" .exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ G \ gattaca_7mp 3_zefen \ gattaca - 03 the one moment.mp3" "popd) 7-Zip 4.65 Copyright (c) 1999-2009 Игорь Павлов 2009 Сканирование Обновление архива c: \ $$ - edrive \ FGH.7z Ошибка: не удается открыть файл FGH.7z.tmp Доступ запрещен. Системная ошибка: неопределенная ошибка ===== Возможно, самая важная ошибка - отказ в доступе?
PrincessPooleRulz
Можете ли вы добавить несколько примеров строк (с пробелами и без) из вашего фактического списка файлов на ваш вопрос выше?
Каран
Итак, я заменил все пробелы в точках в именах файлов, но не в путях, которые я сейчас попробую. вывод по-прежнему: C: \ Programs \ zippers \ 7-Zip> (______ pushd c: _______ c: \ Programs \ zippers \ 7-Zip \ 7z.exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ F \ filmmusic_14mp3_foretean \ starcraft .-. starcraft.vs.south.park.mp3 "_______ popd________) ________ Сканирование Обновление архива c: \ $$ - edrive \ FGH.7z Ошибка: невозможно открыть файл FGH.7z.tmp Access отказано. Системная ошибка: неопределенная ошибка
PrincessPooleRulz
«Я заменил все пробелы в точках в именах файлов». То есть вы переименовали реальные файлы или просто отредактировали файл списка? Пробелы в именах файлов и путях должны быть хорошими, см. Мое редактирование выше (т.е. из вашего списка файлов удалите C: \ и поместите кавычки вокруг всех путей). Теперь вы сможете использовать 7z напрямую вместо моего обходного пути к пакетному файлу.
Каран
1. Я переименовал оба = = = = = = 2. Я внес ваши изменения, но он по-прежнему не работает с 7z = = = = = = 3. $$ - edrive \ действительно единственный верхний каталог. = = = = = 4. Сообщения об ошибках = = = = = ПРЕДУПРЕЖДЕНИЯ для файлов: = = = = = $$ - edrive: система не может найти этот файл. = = = = = = = = = = "$$ - edrive: система не может найти этот файл. = = = = = = = = = = ПРЕДУПРЕЖДЕНИЕ: не удается найти 2 файла = = = = = C: \ Programs \ zippers \ 7-Zip> = = = = = обратите внимание, что есть два предупреждения, а второе начинается с одной двойной кавычки ... Странно?
PrincessPooleRulz
0

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

MT_Head
источник
Вы знаете, как сохранить структуру папок при архивировании файлов в архив? Они говорят, что это по умолчанию, но это не так.
PrincessPooleRulz
@ user194767 - Я использую командную строку, например: %ZDIR%\7z a -t7z -r -mx=1 %ZIP%\mydocu "c:\My Documents\*.*" -wc:\tempгде ZDIRпуть к 7-Zip и ZIPдиск назначения.
MT_Head
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

Я создал скрипт bat для использования с 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%) и нажмите кнопку.

grabantot
источник