Использование bash zip из целевого каталога против внешнего - PullRequest
0 голосов
/ 08 ноября 2019

Допустим, я нахожусь в ~ и хочу заархивировать содержимое каталога ~ / folder-to-zip

Я могу перейти в папку-to-zip и набрать zip -r9 ../zipped.zip *, и это приводит крезультат, который я хочу.

Я хотел сделать то же самое, не используя cd из ~. Итак, из ~ я попробовал zip -r9 zipped.zip folder-to-zip/*, но это дало немного другой файл zip. Эти команды не делают одно и то же?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Непонятно, почему вы не хотите уходить от ~. Предполагая, что вы не хотите беспокоиться о том, чтобы вернуться к ~ после zip, вы можете поместить cd + zip в вложенную оболочку.

(cd ~/folder-to-zip && zip -r9 ../zipped.zip *)

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

zip -j -r9 zipped.zip -9 folder-to-zip/*

Обновление 1:

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

# Bash Only (using OLDPWD)
(cd /path/to/folder/to/zip && zip -r9 $OLDPWD/zipped.zip *)

# Posix (using initial PWD, instead of OLDPWD)
(HERE=$PWD ; cd /path/to/folder/to/zip && zip -r9 $HERE/zipped.zip *)
1 голос
/ 08 ноября 2019

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

Пример:

.
└── test
    ├── file1
    ├── file2
    ├── file3
    └── foo
        ├── file4
        └── file5

ЕслиВ этом примере я нахожусь в корневом каталоге и использую следующую команду:

zip -r test.zip test/*

Я получаю следующий результат:

$ unzip -l test.zip
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2019-11-08 16:51   test/file1
        0  2019-11-08 16:51   test/file2
        0  2019-11-08 16:51   test/file3
        0  2019-11-08 16:53   test/foo/
        0  2019-11-08 16:52   test/foo/file4
        0  2019-11-08 16:53   test/foo/file5
---------                     -------
        0                     6 files

Однако, если я изменю каталог на test, иэта команда:

cd test
zip -r ../test2.zip *

Я получаю следующий zip-файл:

$ unzip -l test2.zip
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2019-11-08 16:51   file1
        0  2019-11-08 16:51   file2
        0  2019-11-08 16:51   file3
        0  2019-11-08 16:53   foo/
        0  2019-11-08 16:52   foo/file4
        0  2019-11-08 16:53   foo/file5
---------                     -------
        0                     6 files

В сторону:

В сторону, если у вас нет каталогаВ структуре можно указать -j, которая удалит все пути и сохранит все файлы в корне zip-файла:

# from the root of the example structure
zip -j test3.zip test/*

Производит:

$ unzip -l test3.zip
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2019-11-08 16:51   file1
        0  2019-11-08 16:51   file2
        0  2019-11-08 16:51   file3
        0  2019-11-08 16:52   file4
        0  2019-11-08 16:53   file5
---------                     -------
        0                     5 files
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...