Решение perl
:
perl -F']' -anle '$h{$F[1]} = $_; END{print $h{$_} for keys %h}' file
Используйте опцию -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)
Утилита 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