本需求是自己负责的一个生产系统上,有大量以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 指定新文件的文件名,注意这个文件一定要在脚本当前目录下

binrar,bin7z 指定解压缩命令目录,因为7z和rar都不是CentOS自带的

fl 是filelist文件列表里的每一条记录

exist 压缩文件fl的内容列表里包含tftpd32.exe的记录,可能有多行

dirfiles 处理exist的结果,形如压缩包里的目录结构 your/dir/tftpd32.exe,可能有多行

df 是dirfiles中的单行记录,它的前面目录部分便是tmp_dir

是否有必要root用户执行看个人情况,执行后部分文件的属主可能会变,可用chown user1.user1 -R /your/dir/恢复

有部分zip文件无法使用7z,但文件本身正常,从日志可以看到error信息

tftpd32.exe区分大小写,如果要查找替换Tftpd32.exe请修改后在执行(确保grep没有-i选项)

可以处理的情况

压缩文件中无tftpd32.exe

要替换的tftpd32.exe文件在压缩文件根目录下

要替换的tftpd32.exe在嵌套子目录中

压缩文件中存在多个tftpd32.exe

压缩文件本身存在问题

该脚本有一定的危险性(虽然已备份),在正式环境中运行之前一定要多做测试。并且运行一次之后,谨慎运行第二次,因为可能会导致备份被覆盖(可换备份目录)

假如出现异常,要从备份文件恢复所有修改的文件,可以根据$existlist和filebak下的目录列表拼凑cp语句

建议执行方法./rar_new.sh | tee your.log,事后可从your.log中查看日志

处理rar的脚本rar_new.sh:

#!/bin/bash

filelist="testfile"

# filelist="crm_rar.txt"

existlist="${filelist}.exist"

errorlist="${filelist}.not"

filebak="/crmbak/rarbak"

oldfile=tftpd32.exe

newfile=tftpd32.exe

binrar="/usr/bin/rar"

IFS=$'\n'

echo "files list bellow have ${oldfile}:" > $existlist

echo "files list bellow do not have ${oldfile} or may have error:" > $errorlist

for fl in `cat $filelist`

do

# ${oldfile} exist or not, file error or not

exist=`$binrar l $fl |grep ${oldfile}`

if [ $? -ne 0 ];then

echo "$fl" >> $errorlist

continue

else

# get extracting dir and filename, could be more than one file

dirfiles=`echo "$exist" | awk '{for (i=5;i<=NF;i++) printf $i" " ; print ""}'`

fi

# echo "$exist"

if [ "$dirfiles" != "" ];then

echo "$fl" | tee -a $existlist

# backup original file

/bin/cp -af "$fl" "$filebak/"

echo "--- $fl is backed up in $filebak"

echo " $dirfiles"

for df in `echo "$dirfiles"`

do

# create temp directory to put new ${newfile} for compress

tmp_dir=$( echo "$df" | awk -F '/' '{for(i=1;i

if [ ${#tmp_dir} -ne 0 ];then

mkdir -p "$tmp_dir" && cp -af ${newfile} "$tmp_dir"

fi

# start delete old file and add new one

$binrar d "$fl" "$tmp_dir"${oldfile} && $binrar a "$fl" "$tmp_dir"${newfile}

if [ $? -ne 0 ];then

echo "--- rar file $fl may have error, you SHOULD check it"

fi

if [ ${#tmp_dir} -ne 0 ];then

rm -f "$tmp_dir"${newfile} && rmdir -p "$tmp_dir"

if [ $? -ne 0 ];then

echo "--- tmp_dir $tmp_dir delete fail"

fi

fi

done

echo "--- old deleted, new added"

fi

done

处理zip的脚本zip_new.sh:

#!/bin/bash

# filelist="test_filelist"

filelist="crm_zip.txt"

existlist="${filelist}.exist"

errorlist="${filelist}.not"

filebak="/crmbak/zipbak"

oldfile=Tftpd32.exe

newfile=tftpd32.exe

bin7z="/usr/bin/7z"

export LANG="zh_CN.GB18030"

IFS=$'\n'

echo "files list bellow have ${oldfile}:" > $existlist

echo "files list bellow do not have ${oldfile} or may have error:" > $errorlist

for fl in `cat $filelist`

do

# ${oldfile} exist or not, file error or not

exist=`$bin7z l $fl |grep ${oldfile}`

if [ $? -ne 0 ];then

echo "$fl" >> $errorlist

continue

else

# get extracting dir and filename, could be more than one file

dirfiles=`echo "$exist" | awk '{for (i=6;i<=NF;i++) printf $i" " ; print ""}'`

fi

# echo ===== "$dirfiles"

if [ "$dirfiles" != "" ];then

echo "$fl" | tee -a $existlist

# backup original file

/bin/cp -af "$fl" "$filebak/"

echo "--- $fl is backed up in $filebak"

echo " $dirfiles"

for df in `echo "$dirfiles"`

do

# create temp directory to put new ${newfile} for compress

tmp_dir=$( echo "$df" | awk -F '/' '{for(i=1;i

if [ ${#tmp_dir} -ne 0 ];then

mkdir -p "$tmp_dir" && cp -af ${newfile} "$tmp_dir"

fi

# start delete old file and add new one

$bin7z d "$fl" "$tmp_dir"${oldfile} && $bin7z a "$fl" "$tmp_dir"${newfile}

if [ $? -ne 0 ];then

echo "--- zip file $fl may have error, you SHOULD check it"

fi

if [ ${#tmp_dir} -ne 0 ];then

rm -f "$tmp_dir"${newfile} && rmdir -p "$tmp_dir"

if [ $? -ne 0 ];then

echo "--- tmp_dir $tmp_dir delete fail"

fi

fi

done

echo "--- old deleted, new added"

fi

done

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

  1. Linux第八章:1.linux下如何压缩 rar、zip、gz、tar.gz文件和解压 rar、zip、gz、tar.gz文件

    零.*.rar 文件格式 步骤一:安装rar工具 1.linux不自带rar格式的压缩和解压工具,我们需要自行下载 2.运行命令下载: wget https://www.rarlab.com/rar/ ...

  2. 字体在ppt中可以整体替换吗_如何在ppt2010中批量替换字体

    有时当我们在制作完成演示文稿的时候,才发现里面的字体并不是我们想要的,为了快速修改,我们可以使用ppt中的替换功能来进行批量字体的修改,下面就让学习啦小编告诉你在ppt2010中批量替换字体的方法,希 ...

  3. 怎样在word中批量替换文字?Word替换文字这一招你会吗?

    平时我们在编辑word文档的时候,经常会遇到将文档中的某一个文字或者是数字替换成别的内容,很多人想到的方法就是一个字一个字的找,之后进行更改,这样会很耽误我们的时间,如果你的文档内容过多的话难道你也会 ...

  4. 群晖自动删除重复文件_在群晖中批量删除重复文件(零基础手把手图文)

    在群晖中批量删除重复文件(零基础手把手图文) 2020-03-26 14:51:01 24点赞 229收藏 39评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标就有,邀新任务奖励无上限,点击 ...

  5. Excel如何在整个工作簿中批量替换指定数据

    今天跟大家分享一下Excel如何在整个工作簿中批量替换 1.下面以下图为例跟大家介绍一下怎么批量替换整个工作簿数据. 2.首先我们点击下图选项 3.单击[更多].[批量替换] 4.选择全部工作表,然后 ...

  6. ppt中批量替换字体 没有被替换目标字体的解决办法

    PPT中批量替换字体功能非常实用且易用,但如果在使用过程中发现,"替换"一栏中没有找到自己想要替换掉的字体怎么办? 办法就是使用中间字体替换法. 假设现在字体有宋体和微软雅黑,想把 ...

  7. php批量替换文件内容,写了个遍历目录、批量替换文件内容的类

    之前有需要,就写了这个类. 功能: 1 遍历目录下的所有文件(可指定后缀名) 2 批量替换文件内容(正则.字符串) 3 批量替换文件后缀名 4 批量替换文件编码 使用例: $dirExplorer = ...

  8. W ndoWs文件夹窗口,如何在本地网络中访问-Synology-NAS-上的文件-(Wndows).pdf

    如何在本地网络中访问-Synology-NAS-上的文件-(Wndows) 如何在本地网络中访问 Synology NAS 上的文件 (Windows) 概述 Synology NAS 经过专门设计, ...

  9. python读取压缩文件的大小_python查看zip包中文件及大小的方法

    python查看zip包中文件及大小的方法 本文实例讲述了python查看zip包中文件及大小的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python import ...

  10. java 文本编辑器替换特殊字符_linux中批量替换文本中字符串--转载

    (一)通过vi编辑器来替换. vi/vim 中可以使用 :s 命令来替换字符串. :s/well/good/ 替换当前行第一个 well 为 good :s/well/good/g 替换当前行所有 w ...

最新文章

  1. 谷歌“亲儿子”竟然成为了NLP革新者
  2. 马云:员工的离职原因--转载
  3. MAC卸载java 12.0.2
  4. java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
  5. linux系统搭建ftp服务器--只给某个用户访问其默认目录下的文件
  6. matlab中GUIDE的UItable居中方法
  7. 蓝桥杯---等差数列(C语言)
  8. 【李宏毅2020 ML/DL】P60-61 Unsupervised Learning - Deep Generative Model
  9. 通过Maven找java source源码方法
  10. spark记录(6)SparkCore的调优之开发调优
  11. Java打印菱形(一)
  12. 使用引导扇区维护工具BOOTICE编辑系统启动列表BCD文件
  13. 浅探PWM整流器的开环整流模式
  14. Windows XP 按权限设置共享
  15. 主板后置音频接口图解_全程图解:手把手教你主板各种插针接口与机箱的接法_通信数码...
  16. 007-aven-assembly-plugin和maven-jar-plugin打包,java启动命令
  17. redis集群在mac本地重启
  18. 如何预估一个产品的DAU? 这个方法又简单又实用 | 附Excel实操模板
  19. 监控系统体系1-数据流监控系统
  20. 腾讯云服务器的购买、注册和登录

热门文章

  1. [la P4487] Exclusive-OR
  2. 不同系统下的shell的不同_案例分析 | 不同安装角度下平板集热器阳台壁挂式太阳能热水系统性能分析...
  3. C语言 逻辑运算符及其优先级
  4. 摄影曝光口诀_摄影中的“向右曝光”是什么以及为什么要这么做
  5. python的def什么意思_「Python基础」def是什么?如何自定义函数def
  6. python里面的return是什么意思_python中return是什么意思?
  7. Android对应颜色值代码
  8. Go语言自学系列 | 安装Golang
  9. 2020 JUSTCTF F@k3 0ff1c@l REVERSE WP
  10. VBR、ABR、CBR三种编码方式