Архивирование архива без включения родительского каталога
Я хочу сжать много папок в дереве каталогов, как это
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.
-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" ./*)