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

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

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

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

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

7 ответов

Решение

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

Пример:

/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;

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

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

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

Использовать -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).

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

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..
      cd `dirname path/to/archive` && zip -rq $OLDPWD/arhive.zip . && cd -

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

      (cd MyDirectory && zip -r - .) >MyArchive.zip

Это позволяет указать результирующее имя файла относительно текущего каталога, а не относительно целевого каталога.

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

Вместо вы можете указать файлы/каталоги относительно целевого каталога, который вы хотите включить.

в отличие он сохраняет пути относительно целевого каталога, а не объединяет все файлы в один каталог.

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

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

#!/bin/bash
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
(cd "path/to/some/deep/directory/" && zip -r "${dir}/file.zip" ./*)
Другие вопросы по тегам