Я хочу заархивировать много папок в дереве каталогов следующим образом
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 .)
Он сохраняет основную оболочку в том же каталоге и изменяет только каталог вложенной оболочки, которая умирает после выполнения команды.
Plat0n
25.Август.2022 06:00:22
#6
Другие ответы меня не удовлетворили, потому что они либо включали всю структуру каталогов в 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
) и вы можете указать любой каталог (не только дочерние)