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

Я хочу заархивировать много папок в дереве каталогов следующим образом

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

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

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

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

Из справочная страница zip:

-j--junk-pathsStore 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).

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

Пример:

/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 somedir ; zip -r ../zipped.zip . * ; cd ..

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

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

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

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

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

#!/bin/bashdir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)(cd "path/to/some/deep/directory/" && zip -r "${dir}/file.zip" ./*)
cd `dirname path/to/archive` && zip -rq $OLDPWD/arhive.zip . && cd -

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