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
-
第一个属性为[d]一个目录,比如一个文件夹
-
第一个属性为[-]是说明是问文件的意思,但也可能是硬连接
纯文本文件(ASCII):可以直接读到的数据文件,例如数字、字母等,可以用“cat”来读出里面的内容。
二进制文件(binary):LINUX中的可执行文件(scripts,文字批处理文件不算)就是这种格式,例如 ls,cat等。
数据格式文件(data):一种以特定格式存储的文件(有些程序在运行过程中会读取某些特定格式文件),用 cat 读取时会出现乱码,此类文件能通过 last 这个命令读出来。 -
第一个属性为[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
- 第一个属性为[b](block)块设备文件 : 就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/sda等文件。
- 第一个属性为[c]字符(character)设备文件:即串行端口的接口设备,如键盘鼠标等。
- 第一个属性为[s](sockets)这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。最常在 /var/run目录中看到这种文件类型
- 第一个属性为[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