shell脚本在工作中的应用

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

你可能感兴趣的:(linux,shell,linux,find)