Как упаковать отдельно расположенные файлы в ту же структуру папок?

Решение perl:

perl -F']' -anle '$h{$F[1]} = $_; END{print $h{$_} for keys %h}' file
0
22.10.2014, 08:09
2 ответа

Используйте опцию -j, чтобы застегнуть молнию для удаления (мусора) путей:

-j
. --junk-paths
Храните только имя сохраненного файла (мусорный путь), и не храните имена каталогов. По умолчанию, zip будет хранить полный путь (относительно текущего каталога).

Пример

Например, предположим, что у нас есть эти файлы:

$ ls */
a/:
file

b/:
file2

И мы архивируем их с помощью -j:

$ zip -j new.zip */*
  adding: file (stored 0%)
  adding: file2 (stored 0%)

Они хранятся без путей:

$ unzip -l new.zip
Archive:  new.zip
  Length      Date    Time    Name ("^" ==> case
---------  ---------- -----   ----   conversion)
        0  2014-10-21 22:15   file
        0  2014-10-21 22:14   file2
---------                     -------
        0                     2 files

Файлы с одним и тем же базовым именем сгенерируют ошибку

Обратите внимание, что с помощью -j, если два файла с разными путями имеют одно и то же имя, то это будет ошибкой:

$ zip -j new2.zip */*
        zip warning:   first full name: a/file
                      second full name: b/file
                     name in zip file repeated: file
                     this may be a result of using -j

zip error: Invalid command arguments (cannot repeat names in zip file)
4
28.01.2020, 02:17

Утилита ZIP имеет вариант - Thunk-Path для этого:

$ zip --junk-path pack.zip home/jack/jack.txt home/jim/jim.txt
  adding: jack.txt (stored 0%)
  adding: jim.txt (stored 0%)
$ unzip -l pack.zip 
Archive:  pack.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2014-10-22 07:12   jack.txt
        0  2014-10-22 07:12   jim.txt
---------                     -------
        0                     2 files
1
28.01.2020, 02:17

Теги

Похожие вопросы