shell脚本在工作中的应用

本文详细介绍了一个具体的Shell脚本应用案例,包括如何获取生产环境中指定目录下的文件夹和文件名,并在其他环境中创建相应的空文件夹和文件。同时,文章深入解析了Linux文件系统的各种文件类型及其对应的符号表示,以及如何使用find命令结合类型筛选进行文件搜索。

shell脚本在工作中的使用

场景描述

亮哥:有个需求,获取一下生产上某个目录的文件夹名字和文件名字,然后在其他环境上创建一下这些空文件夹和空文件。
小编:OK,脚本我熟悉,小意思。
小编开始了写脚本之路小编是这么实现的,列位看一下

脚本内容

获取文件夹
#Shell脚本的标志
#!/bin/bash
#显示开始执行时间重定向到documentTime.txt文件中去
echo getDocument start date `date "+%Y-%m-%d %H:%M:%S"` >>./documentTime.txt
#找路径下的文件夹,将信息定位到document.txt文件中去
find  /home/bea/dir/* -type d >> ./document.txt
echo getDocument end date `date "+%Y-%m-%d %H:%M:%S"` >>./documentTime.txt
获取创建文件
#!/bin/bash
echo getFileName start date `date "+%Y-%m-%d %H:%M:%S"` >>./fileNameTime.txt
#找路径下的文件,将信息定位到document.txt文件中去
find  /home/bea/web-doc/wls/content/rootDir/* -type f >> ./fileName.txt
echo getFileName end date `date "+%Y-%m-%d %H:%M:%S"` >>./fileNameTime.txt

扩展知识

扩展当你使用"ll"命令查看时第一个属性会有几种符号表示,分别是"-",“d”,“l”,“b”,“s”,“c”,“p”
初次知道这些的时候,是在亮哥的影响下,看腾讯课堂的免费课,是李明和刘超老师讲的,到现在只记住了"-",“d”,"l"其他的均忘了,还好有大神看大神的博客

在Linux中有个概念就是所有即文件,不管你是什么都可以使用文件的方式来表示,用ls -l查看第一个属性来看一下都是有7种类型的文件

[activemq@localhost ~]$ ll
drwxrwxr-x. 2 activemq activemq  6 May 15 12:14 Dir
-rw-rw-r--. 2 activemq activemq  0 May 15 12:11 file
lrwxrwxrwx. 1 activemq activemq  3 May 15 12:14 link -> Dir
  1. 第一个属性为[d]一个目录,比如一个文件夹

  2. 第一个属性为[-]是说明是问文件的意思,但也可能是硬连接

    纯文本文件(ASCII):可以直接读到的数据文件,例如数字、字母等,可以用“cat”来读出里面的内容。
    二进制文件(binary):LINUX中的可执行文件(scripts,文字批处理文件不算)就是这种格式,例如 ls,cat等。
    数据格式文件(data):一种以特定格式存储的文件(有些程序在运行过程中会读取某些特定格式文件),用 cat 读取时会出现乱码,此类文件能通过 last 这个命令读出来。

  3. 第一个属性为[l]代表是软件接的形式,就像是windows中的快捷方式

[activemq@localhost dev]$ ll /dev
brw-rw----. 1 root disk      8,   0 May 15 08:55 sda
crw-------. 1 root root     10, 238 May 15 08:55 vhost-net
[activemq@localhost dev]$ ll /var/run/
srw-rw-rw-.  1 root           root              0 May 15 08:55 gssproxy.sock
  1. 第一个属性为[b](block)块设备文件 : 就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/sda等文件。
  2. 第一个属性为[c]字符(character)设备文件:即串行端口的接口设备,如键盘鼠标等。
  3. 第一个属性为[s](sockets)这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。最常在 /var/run目录中看到这种文件类型
  4. 第一个属性为[p]FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。

soket与FIFO比较难以理解,这两个东西与进程有关系(process)

则 查找某个属性时对应的是这样的

find -type   f  // 普通文件
			 d  //目录文件
             l   //链接文件
             b  //块设备文件
             c  //字符设备文件
             p  //管道文件
             s  //socket文件
好了,获取到了,我们要在其他环境执行了,执行的命令如下 
创建文件夹
#!/bin/bash
createDocumentStartTime(){
	echo createDocument start date `date "+%Y-%m-%d %H:%M:%S"` >>./createDocumentTime.txt
}
createDocument(){
	if [ -f document.txt ];then
		for line in  `cat document.txt`
			do 
				#v 参数是打印过程的参数,全称是verbose
				#p, --parents  可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录; 
				mkdir -pv $line >>./backupDocument.txt
			done	
	fi
}
createDocumentEndTime(){
	echo createDocument end date `date "+%Y-%m-%d %H:%M:%S"` >>./createDocumentTime.txt
}
#将多余的内容替换掉 此实验环境是centos7的系统,环境不同则会有差异
replaceChar(){
    sed -i 's/mkdir: created directory ‘//' backupDocument.txt
    sed -i 's/\(.*\)\(.\)/\1/g'  backupDocument.txt
}
createDocumentStartTime
createDocument
createDocumentEndTime
replaceChar
创建文件
#!/bin/bash
createFileStartTime(){
	echo createFile start date `date "+%Y-%m-%d %H:%M:%S"` >>./createFileTime.txt
}
createFile(){
	if [ -f fileName.txt ];then
		cat fileName.txt | while read line
    		do
    			#判断文件是否存在,存在即不创建但打印出信息
		        if [ -f "$line" ];then
		            echo "$line" >>./noCreateFile.txt
		        else
		            echo "$line" >>./backupFile.txt
			    	touch "$line"
		    	fi
	    	done
	fi
}
createFileEndTime(){
	echo createFile end date `date "+%Y-%m-%d %H:%M:%S"` >>./createFileTime.txt
}
createFileStartTime
createFile
createFileEndTime

如果遇到回退咋办呢?继续

#!/bin/bash
rollbackFileStartTime(){
	echo rollbackFile start date `date "+%Y-%m-%d %H:%M:%S"` >>./createFileTime.txt
}
rollbackFile(){
	if [ -f backupFile.txt ];then
		cat backupFile.txt | while read line
    		do
		        if [ -f "$line" ];then
		      		#删除记录的文件,删除时记录过程
		            rm -rvf "$line" >>./rollBackFile.txt
		        else
		            echo "$line" >>./rollBackNoDeleteFile.txt
		    	fi
	    	done
	fi
}
rollbackFileEndTime(){
	echo rollbackFile end date `date "+%Y-%m-%d %H:%M:%S"` >>./createFileTime.txt
}
rollbackFileStartTime
rollbackFile
rollbackFileEndTime

回退文件夹

#!/bin/bash


rollbackDocumentStartTime(){
	echo rollbackDocument start date `date "+%Y-%m-%d %H:%M:%S"` >>./rollBackDocumentTime.txt
}
rollbackDocument(){
	if [ -f backupDocument.txt ];then
		for line in  `cat backupDocument.txt`
			do 
				rm -rvf $line >>./rollBackDocument.txt
			done	
	fi
}
rollbackDocumentEndTime(){
	echo rollbackDocument end date `date "+%Y-%m-%d %H:%M:%S"` >>./rollBackDocumentTime.txt
}
rollbackDocumentStartTime
rollbackDocument
rollbackDocumentEndTime

在写脚本的过程中有很多细节问题,比如书符号的问题是双引号还是单引号,大家可以根据情况而定,一定要多换一下思维,不要卡在一个地方,
参考 :
http://blog.sina.com.cn/s/blog_6e26e1810101cj18.html

1. 上线前的备份工作: 按日期生成上线记录文件夹 文件结构目录和正式环境保持一致 备份你所涉及到的修改文件 2. 上线前的准备工作: 把你修改到的patch文件 到 PATCH_ROOT 目录中 文件结构目录和正式环境保持一致 3. 上线工作: diff -r -b 比较 备份环境 和 发布环境 文件差异; 再次确定修改是否正确 PATCH_ROOT 下的文件夹和文件 发布到正式环境 即可; 完成上线后,要检查系统功能是否正确。 4. 回滚工作: BAK_ROOT 下的文件夹和文件 回滚到正式环境 即可 ; 完成回滚后 要检查系统功能是否正确回滚。 5. shell脚本功能: === 参数配置 ===: #指定正式环境的路径 正式环境的文件 WEB_ROOT=/var/www/html echo ${WEB_ROOT} #指定发布环境的路径 发布环境的文件 PAT_ROOT=/home/chenlong/blog echo ${PAT_ROOT} #指定发布管理日志的路径 记录发布过程,完成文件备份和文件patch PUB_ROOT=/home/chenlong/Publish === 使用方法 ===: #./apply.sh blog /home/chenlong/patch_sh/list20100520.txt 例如 -bash-3.2$ ./apply.sh blog /home/chenlong/patch_sh/list20100520.txt /var/www/html /home/chenlong/blog /home/chenlong/Publish blog /home/chenlong/patch_sh/list20100520.txt /home/chenlong/patch_sh === cmd === :/home/chenlong/patch_sh/apply_cp.sh /var/www/html/wp-includes/js/common.js /home/chenlong/Publish/blog/2010-05-21/bak /bin/cp /var/www/html/wp-includes/js/common.js /home/chenlong/Publish/blog/2010-05-21/bak/var/www/html/wp-includes/js/common.js === cmd === :/home/chenlong/patch_sh/apply_cp.sh /var/www/html/upload_editor.php /home/chenlong/Publish/blog/2010-05-21/bak /bin/cp /var/www/html/upload_editor.php /home/chenlong/Publish/blog/2010-05-21/bak/var/www/html/upload_editor.php === cmd === :/home/chenlong/patch_sh/apply_cp.sh /var/www/html/BM/Tpl/default/Admin/Img/index.php /home/chenlong/Publish/blog/2010-05-21/bak /bin/cp /var/www/html/BM/Tpl/default/Admin/Img/index.php /home/chenlong/Publish/blog/2010-05-21/bak/var/www/html/BM/Tpl/default/Admin/Img/index.php === cmd === :/home/chenlong/patch_sh/apply_cp.sh /home/chenlong/blog/wp-includes/js/common.js /home/chenlong/Publish/blog/2010-05-21/patch /bin/cp /home/chenlong/blog/wp-includes/js/common.js /home/chenlong/Publish/blog/2010-05-21/patch/home/chenlong/blog/wp-includes/js/common.js === cmd === :/home/chenlong/patch_sh/apply_cp.sh /home/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值