Zip компресс без папок root - PullRequest
0 голосов
/ 29 апреля 2020

Моя проблема в том, что мне нужно сгенерировать zip-файл с помощью команды консоли linux zip. Моя команда выглядит следующим образом:

zip -r /folder1/folder2/EXP_45.zip /folder1/folder2/EXP_45/

, который возвращает правильный почтовый индекс, который включает в себя root папки, которые я хочу:

Возвращает

EXP_45.zip

-folder1

- папка2

--- EXP_45

...

Я хочу

EXP_45.zip

-EXP_45

...

EXP_45 является Папка, которая может содержать файлы и папки, и они должны присутствовать в zip. Я просто хочу, чтобы древовидная структура начиналась с папки EXP_45.

Есть ли какое-либо решение?

Причина, по которой мне нужно, чтобы это была одна команда, заключается в том, что это действие задания в PL SQL функции, такие как:

BEGIN
DBMS_SCHEDULER.CREATE_JOB ( 
    JOB_NAME=>'compress_files',       --- job name 
    JOB_ACTION=>'/usr/bin/zip',    --- executable file with path 
    JOB_TYPE=>'executable',        -----   job type
    NUMBER_OF_ARGUMENTS=>4,  --  parameters in numbers                   
    AUTO_DROP =>false,
    CREDENTIAL_NAME=>'credentials'   -- give credentials name which you have created before "credintial"
    );

dbms_scheduler.set_job_argument_value('compress_files',1,'-r');
dbms_scheduler.set_job_argument_value('compress_files',2,'-m');
dbms_scheduler.set_job_argument_value('compress_files',3,'/folder1/folder2/EXP_45.zip');
dbms_scheduler.set_job_argument_value('compress_files',4,'/folder1/folder2/EXP_45/');
DBMS_SCHEDULER.RUN_JOB('compress_files');
END;

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Мне не удалось найти решение этой проблемы с помощью zip, но я нашел его с помощью jar. Команда будет выглядеть так:

jar cMf /folder1/folder2/EXP_45.zip -C /folder1/folder2/EXP_45 .

Кроме того, решение, использующее задание в pl sql на случай, если оно работает для кого-то, будет:

BEGIN
DBMS_SCHEDULER.CREATE_JOB ( 
    JOB_NAME=>'compress_files',       --- job name 
    JOB_ACTION=>'/usr/bin/jar',    --- executable file with path 
    JOB_TYPE=>'executable',        -----   job type
    NUMBER_OF_ARGUMENTS=>5,  --  parameters in numbers                   
    AUTO_DROP =>false,
    CREDENTIAL_NAME=>'credentials'   -- give credentials name which you have created before "credintial"
    );

dbms_scheduler.set_job_argument_value('compress_files',1,'cMf');
dbms_scheduler.set_job_argument_value('compress_files',2,'/folder1/folder2/EXP_45.zip');
dbms_scheduler.set_job_argument_value('compress_files',3,'-C');
dbms_scheduler.set_job_argument_value('compress_files',4,'/folder1/folder2/EXP_45');
dbms_scheduler.set_job_argument_value('compress_files',5,'.');
DBMS_SCHEDULER.RUN_JOB('compress_files');
END;
0 голосов
/ 29 апреля 2020

Вы хотите использовать параметр -j (или --junk-paths) при создании zip-файла. Ниже приведена справочная страница 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).

Обновление после уточнения вопроса

Почему бы не поместить эквивалент кода, приведенного ниже, в скрипт оболочки и получить SQL функция, чтобы вызвать это? Вам просто нужно передать имя каталога в cd и имя выходного zip.

cd folder1/folder2
zip -r /tmp/EXP_45.zip EXP_45
...