Linux替换压缩包下的文件,Linux下rar及zip压缩包中批量替换某文件脚本

本需求是自己负责的一个生产系统上,有大量以zip和rar结尾的压缩文件散落在文件系统的各个文件夹,先在需要把压缩包里包含某一个特定文件(如tftpd32.exe或Tftpd32.exe,版本较旧),全都替换成比较新的tftpd32.exe版本。压缩文件总数约5000个,需要替换的数量约1500个。

因为是生产环境,不敢轻易乱动,所以脚本考虑的因素就非常多,不允许中间执行过程出现异常,所以找到文件后实际执行替换操作之前做好备份,并且将操作过程记录日志。

以下几点需要考虑:

分别处理zip和rar文件,为减低脚本的复杂程度,分作两个shell脚本。

rar在Linux下默认是没有安装解压缩工具,下载rarlinux-x64-5.2.0.tar.gz

zip包中文件含有中文文件名,unzip测试解压缩或列出内容时出现文件名乱码,原因是zip在压缩时不记录当时的编码格式。这个问题非常棘手,乱码打进压缩包是绝对不允许的,网上有几种解压办法有几种办法都不能很好的应对我的场景:并不需要实际解压zip文件,而只需使用 l ——列出文件列表、获取目录及文件名,d ——从压缩包中直接删除某个文件,a ——向压缩包添加一个文件。实际解压到文件系统上是不是乱码我们并不关心。

最后的解决办法是使用p7zip工具,配合LANG变量解决。

向压缩包里添加新文件时,要保持里面的目录结构,则必须在文件系统上存在同样的 相对目录/文件 。所以每次都要在脚本执行目录下创建临时目录tmp_dir,还要及时删除。但如果文件在压缩包的根目录下,这个临时目录就是当前脚本执行目录。

有可能会存在一个压缩包中多个文件夹中包含不止一个tftpd32.exe文件。

每个文件都有一个CRC值,处理文件名大小写不同但实质是同一个文件时有效。

以下脚本使用说明:

变量说明

filelist 变量设定你所需要检查的压缩文件列表(绝对路径),可以通过find /your/dir/ -name *.rar | sort | uniq > testfile。与脚本在相同目录下

existlist 变量是从filelist文件中得到的包含特定文件的列表,脚本执行完后可以查看

errorlist 变量是从filelist文件列表中得到的不包含特定文件的列表,当然也有可能这个压缩文件本身不完整

filebak 变量指定要替换的那个压缩文件备份的目录

oldfile 指定要替换的那个文件名

newfile 指定新文件的文件名&#x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴为您服务!下面是一个bash脚本,用于将当前目录的txt文件压缩成与文件名相同的zip压缩包: #!/bin/bashfor file in *.txt; do zip -j "${file%.*}".zip "$file" done ### 回答2: 下面是一个可以实现你所描述的功能的Linux shell脚本: ```shell #!/bin/bash # 遍历当前目录下的所有txt文件 for file in *.txt; do # 获取文件名(不包含扩展名) filename=$(basename "$file" .txt) # 创建对应的zip压缩包,并将txt文件添加到压缩包 zip "$filename.zip" "$file" # 提示压缩完成 echo "已成功压缩$file到$filename.zip" done ``` 请将上述脚本保存为一个文件(如compress.sh),然后使用chmod命令给予执行权限: ```shell chmod +x compress.sh ``` 之后,在需要执行该脚本的目录下打开终端,并执行以下命令来运行脚本: ```shell ./compress.sh ``` 脚本会自动将该目录下的所有txt文件分别压缩成与txt文件名相同的zip压缩包,并输出相应的提示信息。 ### 回答3: 你好!下面是一个简单的Shell脚本,可以实现将当前目录下的所有txt文件分别压缩为与它们的文件名相同的zip压缩包: ```bash #!/bin/bash # 遍历当前目录下的所有txt文件 for file in *.txt; do # 提取文件名(不包括扩展名) filename=$(basename "$file" .txt) # 将txt文件压缩为zip文件(与文件名相同) zip "$filename.zip" "$file" # 打印处理的文件信息 echo "已压缩文件:$file --> $filename.zip" done ``` 请将以上代码保存为`compress.sh`文件,并在命令行运行`bash compress.sh`命令,即可执行该脚本。执行脚本后,它将遍历当前目录下的所有txt文件,将每个txt文件压缩为与其文件名相同的zip压缩包,并打印出处理过程的信息。 希望这能帮到你!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值