如何用Linux zip命令生成不含上层目录的压缩包并适配PL/SQL任务?
解决方案:调整工作目录后执行压缩
要解决压缩包包含上层目录的问题,关键是先切换到目标文件夹的父目录,再用相对路径压缩目标文件夹,这样zip就只会保留目标文件夹本身及其内部结构,不会带上层路径。
因为需要单条命令适配DBMS_SCHEDULER,我们可以通过bash -c来执行包含目录切换和压缩的命令序列。以下是具体修改:
修改后的PL/SQL代码
BEGIN DBMS_SCHEDULER.CREATE_JOB ( JOB_NAME=>'compress_files', JOB_ACTION=>'/bin/bash', -- 改为调用bash执行命令序列 JOB_TYPE=>'executable', NUMBER_OF_ARGUMENTS=>2, -- 参数数量调整为2 AUTO_DROP =>false, CREDENTIAL_NAME=>'credentials' ); -- 第一个参数:bash的-c选项,用于执行后续命令字符串 dbms_scheduler.set_job_argument_value('compress_files',1,'-c'); -- 第二个参数:先切换到目标文件夹的父目录,再执行压缩 dbms_scheduler.set_job_argument_value('compress_files',2,'cd /folder1/folder2 && zip -r EXP_45.zip EXP_45/'); DBMS_SCHEDULER.RUN_JOB('compress_files'); END; /
原理说明
- 原命令使用绝对路径
/folder1/folder2/EXP_45/作为压缩目标时,zip会将完整的绝对路径包含到压缩包中,导致出现folder1/folder2层级。 - 通过
cd /folder1/folder2切换到目标文件夹的父目录后,用相对路径EXP_45/作为压缩目标,zip就会将EXP_45作为压缩包的根目录,同时完整保留其内部的所有文件和子目录结构。 &&用于确保只有目录切换成功后才执行压缩命令,避免路径错误时产生无效压缩包。
额外验证
如果需要确认压缩包结构,可在执行后用unzip -l /folder1/folder2/EXP_45.zip查看,输出应该直接以EXP_45/开头,没有上层目录。
内容的提问来源于stack exchange,提问作者Drunkpunk Men
相关产品推荐
相关产品推荐

