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

30

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

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

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

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

Dami
источник

Ответы:

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;
zzbomb
источник
да, но у меня есть много файлов, над которыми я делаю одно и то же, так что было бы утомительно делать это так, как сценарий 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).
robrtsql
источник
Похоже, это правильный ответ.
mutant_city
3
А как насчет вложенных путей / папок?
GuyPaddock
3
Это пропустит все папки в архиве, и если у вас есть дубликаты имен файлов в разных папках, это взорвется. Это имеет свое место, но только если вы не заботитесь о папках и просто хотите файлы. Не то, о чем просил ОП, но все же хорошие знания
Говинд Рай
17

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

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..
aluc
источник
5
Хотя это правильный ответ, введение не звучит так, как будто вы сами в этом убеждены. Это также поможет немного объяснить, что делает команда.
Nephente
1
Это было и мое решение, но мне это не нравится, потому что оно связано с этим cd. Хотелось бы найти способ более точно указать сохраненный путь.
Nilskp
3

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

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

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

Кеннет
источник
Я хотел добавить это как комментарий к ответу @Alfred UC , но у меня недостаточно репутации для этого.
Кеннет
Если это действительно решает проблему, то это может быть решением.
Юфенюй Вейех Дидер
Это лучше в качестве ответа. Это работает как в bash, так и в sh?
Арлен Бейлер