it-swarm.xyz

Создание архива из каталога без добавления имени каталога в архив

У меня есть следующая структура папок:

  • корень
    • folder1
    • folder2
    • folder3
    • 7za.exe

Я хочу запустить инструмент командной строки 7-Zip, чтобы сжать все файлы в folder1 в файл Zip с именем folder1.Zip.

Запуск следующего

7za.exe a -tzip folder1.Zip folder1\\*.*

создает файл Zip, как и ожидалось. Однако, когда я открываю Zip-файл, в нем есть папка с именем folder1, и внутри него у меня есть все файлы, которые были в этой папке. Я не хочу, чтобы имя папки добавлялось в папку Zip, т. Е. Я хотел бы добавить все файлы в формате «Flat».

Я также не хочу рекурсивно запускать инструмент командной строки для каждого отдельного файла/папки.

Есть ли переключатель, который обеспечивает эту функциональность?

75
gg.

Из 7-Zip Help file:

Команда (Добавить)

Добавляет файлы в архив.

Примеры

7z a archive1.Zip subdir\

добавляет все файлы и подпапки из папки subdir в архив archive1.Zip. Имена файлов в архиве будут содержать префикс subdir \.

7z a archive2.Zip .\subdir\*

добавляет все файлы и подпапки из папки subdir в архив archive2.Zip. Имена файлов в архиве не будут содержать префикса subdir \.

cd /D c:\dir1\

7z a c:\archive3.Zip dir2\dir3\

Имена файлов в архиве c:\archive3.Zip будут содержать префикс dir2\dir3 \, но они не будут содержать префикс c:\dir1 \.

Таким образом, команда, которую вы хотите, была бы: 7za.exe a folder1.Zip .\folder1\*

Также обратите внимание на обработку символов подстановки в 7-Zip. Он не рассматривает *.* как «все файлы» - это означает «все файлы с точкой в ​​имени файла». Файлы без расширения будут пропущены. Если вы действительно хотите, чтобы все файлы, просто используйте вместо этого *.

Наконец, параметр -tzip не требуется, если имя файла архива оканчивается на .Zip. 7-Zip достаточно умен, чтобы выяснить, какой формат вы хотите в этих случаях. Требуется только в том случае, если вам нужно собственное расширение (например, 7za.exe a -tzip foo.xpi <files> для дополнения Mozilla).

122
afrazier

Это сработало для меня

Рассмотрим структуру папок, например C:\Parent\SubFolders ..... И вы хотите создать parent.Zip, который будет содержать все файлы и папки C:\Parent без родительской папки [т.е. он будет начинаться с SubFolders .....]

cd /D "C:\Parent"

"7z.exe" a Parent.Zip "*.*" -r

Это создаст Parent.Zip в C:\Parent

2
Pritesh Dhokchaule

Просто чтобы расширить принятый ответ (я не смог добавить комментарий там):

В Linux добавление «*» для меня не сработало, поэтому я придумал более подробную командную строку, которая дала желаемый результат:

curr_dir=$(pwd); \ 
cd source_code/lambda/ ; \
7z a ../../lambda.Zip .; \
cd $curr_dir \
unset curr_dir

===========

объяснение сценария:

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

Я надеюсь, что это может быть полезно для кого-то.

0
Humanier