Архивирование архива без включения родительского каталога


30

Я хочу сжать много папок в дереве каталогов, как это

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Когда я пытаюсь заархивировать его, он завершает создание zip-архива с папкой v вместо содержимого (подкаталогов и файлов)

Как я могу избежать этого?

Ответы:


23

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

Пример:

/test/test.txt
/test/test2.txt

где test.txt и test2.txt будут храниться в zip, но не в / test /

Вы можете перейти в каталог / test / и запустить что-то вроде:

zip -r filename.zip ./*

Что бы создать архив в той же папке с именем filename.zip. Или, если запустить его из-за пределов папки, вы можете запустить,

zip -r test.zip test/*

/ * - это часть, которая включает в себя только содержимое папки, а не всю папку.

Изменить: OP хотел несколько почтовых индексов, решение в конечном итоге было немного взломать, мне интересно, есть ли лучший способ сделать это.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

да, но у меня есть много файлов, над которыми я делаю одно и то же, так что было бы утомительно делать это так, как сценарий bash или что-то, что автоматизировало бы тот же процесс в каталоге со всеми папками
Dami

1
Хорошо, я запустил скрипт, и он создал родительский каталог в архиве. Я хочу, чтобы в архиве было только содержимое папки
Dami

1
моя ошибка, немного пропустил. добавил параметр -j, который я только что посмотрел, очевидно пропускает часть, которую вы не хотите. попробуйте это:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb

18
zip -r test.zip test / * извне добавляет test в качестве каталога в zip-файл
smihael

4
как сказал @smihael, zip -r test.zip test/*не работает. Есть ли правильный способ добиться этого за пределами каталога?
17

22

Используйте опцию -jили --junk-pathsв вашей команде zip.

Со страницы руководства zip :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).

Похоже, это правильный ответ.
mutant_city

3
А как насчет вложенных путей / папок?
GuyPaddock

3
Это пропустит все папки в архиве, и если у вас есть дубликаты имен файлов в разных папках, это взорвется. Это имеет свое место, но только если вы не заботитесь о папках и просто хотите файлы. Не то, о чем просил ОП, но все же хорошие знания
Говинд Рай

17

Как насчет этой команды?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
Хотя это правильный ответ, введение не звучит так, как будто вы сами в этом убеждены. Это также поможет немного объяснить, что делает команда.
Nephente

1
Это было и мое решение, но мне это не нравится, потому что оно связано с этим cd. Хотелось бы найти способ более точно указать сохраненный путь.
Nilskp

3

Надеюсь это поможет.

(cd directory && zip -r ../out.zip .)

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


Я хотел добавить это как комментарий к ответу @Alfred UC , но у меня недостаточно репутации для этого.
Кеннет

Если это действительно решает проблему, то это может быть решением.
Юфенюй Вейех Дидер

Это лучше в качестве ответа. Это работает как в bash, так и в sh?
Арлен Бейлер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.