Linux shell zip 命令实现不切换当前终端的工作目录打包另一个路径下的文件和文件夹
如图,我想在当前目录 ~/Bypasser
下打包 src
文件夹,使得生成的 zip 压缩包中具有 src
文件夹下的所有文件夹、所有文件夹中的所有子项目、所有文件,保留层次结构但压缩包中最外面不包含 src
这一层。执行命令时,不要改变当前终端的工作目录。
问了下 GPT,给了几个错误答案,都无法实现。
错误示范一:这个命令虽然保留了层次结构,但最外面有一层 src
。
zip -r "${zipFilePath}" "src"
错误示范二:以为这样就解决了?这个命令虽然保留了层次结构,但最外面依然有一层 src
。
zip -r "${zipFilePath}" "src/*"
错误示范三:虽然最外面那层 src
无了,但目录结构不见了,如果 src
中不存在文件夹,这个命令倒是可以满足要求,但图片中 src
下还有好几层文件夹。
zip -r -j "${zipFilePath}" "src"
一个可能但不是最优的思路:用一个变量保存当前工作目录,利用 cd src/
命令 cd 过去,然后执行 zip -r "${zipFilePath}" *"
,再 cd 回来。
正确命令:
(cd "${srcFolderPath}" && zip -r -v - *) > "${zipFilePath}"
大概思路是,利用 ()
进行代码的执行,就可以不用在当前的终端进行 cd
,从而避免了更改当前终端的工作目录。如果 cd
成功,那就用 zip -r -v
命令进行递归和验证处理,紧接着的一个 -
可以将打包的内容用重定向输出到目标路径中。
综合了下自己的其他需求(抛弃注释信息和转换 LF),这个是我最后使用的命令。
(cd "${srcFolderPath}" && zip -J -ll -r -v - *) > "${zipFilePath}"