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

Я хочу архивировать много папок в дереве каталогов как так

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

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

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

27
задан 28 July 2017 в 12:03

6 ответов

Таким образом, если я понимаю правильно, Вы пытаетесь заархивировать файлы & папки в конкретной папке, но без включения корневой папки.

Пример:

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

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

, Вы могли CD в/test/каталог затем выполнять что-то как,

zip -r filename.zip ./*

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

zip -r test.zip test/*

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

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

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;
23
ответ дан 23 November 2019 в 01:02

Надежда это помогает.

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

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

2
ответ дан 23 November 2019 в 01:02

Используйте -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).
21
ответ дан 23 November 2019 в 01:02

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

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..
17
ответ дан 23 November 2019 в 01:02

Другие ответы меня не удовлетворили, потому что они либо включали всю структуру каталогов в zip, либо включали уродливый ../../../../file.zip путь в команду zip.

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

#!/bin/bash
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
(cd "path/to/some/deep/directory/" && zip -r "${dir}/file.zip" ./*)
3
ответ дан 5 May 2020 в 18:25
cd `dirname path/to/archive` && zip -rq $OLDPWD/arhive.zip . && cd -

Это работает не только с плоским деревом (например, -j), и вы можете указать любой каталог (не только дочерний)

2
ответ дан 18 January 2021 в 20:23

Другие вопросы по тегам:

Похожие вопросы: