Shell脚本实现文件遍历和删除操作
Posted 水木竹水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本实现文件遍历和删除操作相关的知识,希望对你有一定的参考价值。
本文需要实现的功能如下:某文件夹下具有由按数字编号命名的文件夹,需要删除除最大编码外的文件。
具体实现
大致思路:循环遍历该文件夹下所有文件,正则匹配出最大编码文件;然后循环文件,删除除最大编码外的文件。
实现代码如下:
#!/bin/bash function getdir(){ max=0 DATEPATTERN="^[0-9]*$" for element in `ls $1` do if [[ "$element" =~ $DATEPATTERN ]] then if [ `expr $max - $element` -lt 0 ] then max=$element fi fi done for element in `ls $1` do if [[ "$element" =~ $DATEPATTERN ]] then if [ $max != $element ] then rm -rf element fi fi done } root_dir="/root/cloud/builds" getdir $root_dir
实现效果:文件夹:/root/cloud/builds
执行脚本后:
用到的Shell基本知识
1. 变量
shell脚本的变量声明通过“=”进行赋值,与C++或java不同,变量名、值与等号不能有空格,否则无法识别该变量。如
var=10 var1="qwert" var2=\'qwert\'
echo $var #输出 10
echo $var1 #输出 qwert
echo $var2 #输出 qwert
获取变量中的值,采用“$变量名”格式。
2. 字符串
声明字符串可以采用双引号或单引号,但两者有一些区别
单引号:1. 单引号中的字符会原样输出,其中的变量不起作用; 2. 单引号中不能使用转义字符,会报错;
双引号:1. 可以包含变量并取值;2. 可以包含转义字符
#!/bin/bash a=10 val=\'hello world $a\' echo "单引号:"$val val=\'hello \'world\' $a\' echo "单引号+单引号 = 拼接:"$val #val=\'hello \\\'world\\\' $a\' #echo $val #报错:/usercode/file.sh: line 9: unexpected EOF while looking for matching `\'\' val="hello \'world\' $a" echo "双引号+单引号 = 输出单引号:"$val val="hello "world" $a" echo "双引号+双引号 = 拼接:"$val val="hello \\"world\\" $a" echo "双引号+双引号转义字符 = 输出双引号:"$val val="hello "$a"world" echo "双引号+变量 = 拼接:"$val
输出结果:
单引号:hello world $a 单引号+单引号 = 拼接:hello world $a 双引号+单引号 = 输出单引号:hello \'world\' 10 双引号+双引号 = 拼接:hello world 10 双引号+双引号转义字符 = 输出双引号:hello "world" 10 双引号+变量 = 拼接:hello 10world
字符串拼接问题
(1)字符串拼接赋值给变量:双引号或者单引号拼接的时候,如果子字符串完全为纯字符串,之间可以有空格;如果存在变量,则变量与字符串之间不可以有空格;
(2)字符串拼接echo输出:可以有空格。如echo "hello" $a \'world\' 输出:hello 10 world
3. 传递参数
脚本函数获取参数的格式为:$n,n表示第n个参数,如$1表示获取第一个参数,$2表示获取第二个参数。。。。$0表示获取执行脚本名
4. 基本运算
原生的bash不能进行简单的数学计算,可以通过命令实现,如awk或expr。
各种运算规则可参考菜鸟教程:http://www.runoob.com/linux/linux-shell-basic-operators.html
本文中运用到的计算包括:减法计算、不等判断、小于判断,如[ `expr $max - $element` -lt 0 ]、[ $max != $element ]
5. 流程控制
(1)条件判断:
if condition then ...... elif then ...... else ...... fi
(2)for循环
for var in item1 item2 ... itemN do command1 command2 ... commandN done
具体参考:http://www.runoob.com/linux/linux-shell-process-control.html
6. 正则表达式
本文中使用的正则表达式为正整数,如"^[0-9]*$",以^开始、$结束,[0-9]标识0到9之间的任意数字,*代表由前边字符0个或以上个字符组成。具体,可参考http://www.jb51.net/article/94354.htm或相关书籍。
判断目标是否匹配正则表达式,采用双方括号和 =~,如 [[ "$element" =~ $DATEPATTERN ]]
7. #!/bin/bash
#!为约定标记,告诉系统该脚本需要什么解释器来执行,Linux下默认使用bash,可在 /bin目录下查看到bash文件,如下图:
所有需要执行的shell脚本,都需要将其写在第一行。
总结
- 需要花点时间学习下shell的基本语法和命令,可看菜鸟教程,也可看《Shell编程从入门到精通》
- 在shell脚本中使用rm命令的时候,也需要小心,操作不慎可能导致系统挂掉,可看bash脚本中使用rm命令时的致命误区的讲述
2018年1月17号
近日向Maven私库Nexus中部署jar包时,日志文件显示 not enough space,即磁盘空间不足,采用df -hl查看Linux磁盘使用情况,发现磁盘使用率100%。此时需要删除一些历史不用的jar包(包括*.jar *.pom *.jar.md5等),为了能够自动化删除,借助上边思路书写脚本。
根据需要批量删除的文件的文件名包含序列数字,如ssc_base-0.0.1-20180117.014325-32.jar。需要做的工作:(1)需要采用识别文件名的正则表达式;(2)截取文件名中的数字;(3)将文件批量删除
1 #!/bin/bash 2 function getdir(){ 3 max=0 4 DATEPATTERN="^[._A-Za-z0-9-]*-[0-9]*.pom$" 5 for element in `ls $1` 6 do 7 if [[ "$element" =~ $DATEPATTERN ]] 8 then 9 num=$element 10 num=${num##*-} 11 num=${num%%.*} 12 if [ `expr $max - $num` -lt 0 ] 13 then 14 max=$num 15 fi 16 fi 17 done 18 19 echo "********delete jar from $1,the max="$max 20 21 for element in `ls $1` 22 do 23 if [[ "$element" =~ $DATEPATTERN ]] 24 then 25 num=$element 26 num=${num##*-} 27 num=${num%%.*} 28 if [ $max != $num ] 29 then 30 echo rm -rf $1"/"*-$num.* 31 rm -rf $1"/"*-$num.* 32 fi 33 34 fi 35 done 36 } 37 38 root_dir="/usr/src/sonatype-work/nexus/storage/snapshots/yyssc/ssc_base/0.0.1-SNAPSHOT" 39 getdir $root_dir
(1)正则表达式:^[._A-Za-z0-9-]*-[0-9]*.pom$,匹配ssc_base-0.0.1-20180117.014325-32.pom
(2)截取文件.pom前的序列数字:对应9-11行,第10行 num##*-,去除“-”之前的所有字符(结果32.pom);第11行num%%.*,去除“.”之后的所有字符(结果32);参考Shell脚本8种字符串截取方法总结
(3)文件批量删除:注意路径写全,rm -rf $1"/"*-$num.*
以上是关于Shell脚本实现文件遍历和删除操作的主要内容,如果未能解决你的问题,请参考以下文章
交互式shell脚本遍历文件目录下的所有文件和目录(绝对路径)
交互式shell脚本遍历文件目录下的所有文件和目录(绝对路径)