Shell脚本实现文件遍历和删除操作
本文需要实现的功能如下:某文件夹下具有由按数字编号命名的文件夹,需要删除除最大编码外的文件。
具体实现
大致思路:循环遍历该文件夹下所有文件,正则匹配出最大编码文件;然后循环文件,删除除最大编码外的文件。
实现代码如下:
#!/bin/bash
function getdir(){
max=
DATEPATTERN="^[0-9]*$"
for element in `ls $`
do
if [[ "$element" =~ $DATEPATTERN ]]
then
if [ `expr $max - $element` -lt ]
then
max=$element
fi
fi
done for element in `ls $`
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=
var1="qwert"
var2='qwert' echo $var #输出 10
echo $var1 #输出 qwert
echo $var2 #输出 qwert
获取变量中的值,采用“$变量名”格式。
2. 字符串
声明字符串可以采用双引号或单引号,但两者有一些区别
单引号:1. 单引号中的字符会原样输出,其中的变量不起作用; 2. 单引号中不能使用转义字符,会报错;
双引号:1. 可以包含变量并取值;2. 可以包含转义字符
#!/bin/bash
a=
val='hello world $a'
echo "单引号:"$val val='hello 'world' $a'
echo "单引号+单引号 = 拼接:"$val #val='hello \'world\' $a'
#echo $val
#报错:/usercode/file.sh: line : 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'
双引号+双引号 = 拼接:hello world
双引号+双引号转义字符 = 输出双引号:hello "world"
双引号+变量 = 拼接: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)将文件批量删除
#!/bin/bash
function getdir(){
max=
DATEPATTERN="^[._A-Za-z0-9-]*-[0-9]*.pom$"
for element in `ls $`
do
if [[ "$element" =~ $DATEPATTERN ]]
then
num=$element
num=${num##*-}
num=${num%%.*}
if [ `expr $max - $num` -lt ]
then
max=$num
fi
fi
done echo "********delete jar from $1,the max="$max for element in `ls $`
do
if [[ "$element" =~ $DATEPATTERN ]]
then
num=$element
num=${num##*-}
num=${num%%.*}
if [ $max != $num ]
then
echo rm -rf $"/"*-$num.*
rm -rf $"/"*-$num.*
fi fi
done
} root_dir="/usr/src/sonatype-work/nexus/storage/snapshots/yyssc/ssc_base/0.0.1-SNAPSHOT"
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脚本,当用sed删除某一文件里面的内容时,并追加到同一个文件会出现问题。
shell脚本,当用sed删除某一文件里面的内容时,并追加到同一个文件会出现问题.因为初始文件和写入文件是一个文件这是失败的.需要追加到另一个文件,然后再用mv进行操作.[root@localhost ...
- shell 脚本大文件处理
shell 脚本大文件处理 字符串处理 s='{"_id":{"$oid":"59b73d80930c17474f9f050d"},&qu ...
- (转)shell脚本之文件测试操作符及整数比较符
shell脚本之文件测试操作符及整数比较符 原文:http://www.cnblogs.com/Steward-Xu/p/6722592.html 一.文件测试操作符: 在书写测试表达式是,可以使用一 ...
- shell脚本中文件测试
shell脚本中文件测试 author:headsen chen 2017-10-17 14:35:19 个人原创,转载请注明作者,否则 依法追究法律责任 [ -f filename ] ...
- Shell脚本统计文件行数
Shell脚本统计文件行数 转自 http://www.jb51.net/article/61943.htm 示例:row_count.sh文件 awk '{print NR}' row_cou ...
- Java中list如何利用遍历进行删除操作
转: Java中list如何利用遍历进行删除操作 2018年03月31日 10:23:41 Little White_007 阅读数:3874 Java三种遍历如何进行list的便利删除: 1.f ...
- linux shell 中的数组的取值 遍历 替换 删除操作
引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...
- 【shell脚本】通过遍历文件的一种批量执行shell命令的方法。
在分析数据时,经常会有许多机械重复的命令带入,作为一个半路出家的程序猿,我曾经对这种工作束手无策.不像一个熟手那样举重若轻的分析,感觉自己的生信分析完全是个体力活.为了打开这样的局面,我开始学习如何批 ...
- linux shell 脚本 历史文件清理脚本,按天,按月,清理前N天的历史文件,删除指定大小历史文件,历史文件归档清理
不知道大家那有没有要清理的这个事情.需要清理目录历史文件.可能后续也会有很多其他地方需要清理历史文件,可能会用到. 我这两天空闲写了个脚本,清理比较方便,有要进行清理的大量历史文件的话可以用. 脚本用 ...
随机推荐
- 《跟我学IDEA》一、下载安装idea,设置背景字体编码,配置JDK
写在前面的话:作为一个在IT界摸爬滚打6年+的老程序员,我属于会的东西多而杂,但是没有任何一样精通的.曾经自己也认真过,蹉跎过,最近和别的同事朋友聊天时,突然发现自己得到的东西却很少很少,于是想认真的 ...
- spfa_dfs找负环
luogu #include<iostream> #include<cstdio> #include<cstring> #include<vector> ...
- Linux 网络编程中的read和write函数正确的使用方式
字节流套接字上的read和write函数所表现的行为不同于通常的文件IO,字节流套接字上调用read和write输入或输出的可能比请求的数量少,然而这不是出错的状态,例如某个中端使read和write ...
- svn文件回滚到某个历史版本号
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/50819642 本文出自[我是干勾鱼的博客] 有时候想要将svn中的某个文件回滚到 ...
- wps 操作
wps选择视图-->文档结构图
- 【转载】Java 类加载与初始化
原文地址:http://www.cnblogs.com/zhguang/p/3154584.html 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在J ...
- 存储与索引------《Designing Data-Intensive Applications》读书笔记3
在上一篇的笔记之中,我们讨论了数据模型和查询语言.在第三章之中我们来聊一聊不同的数据引擎内部是如何实现存储和检索的,以及不同设计之间的折中与妥协. 1.键值对数据库 键值对数据库是数据库形式之中最简单 ...
- springCloud项目练习
1.https://gitee.com/xfdm/FCat angular4.springcloud开源实战项目:FCat项目(springcloud.mybatis.redis.angular4)是 ...
- Android项目实战(三十七):Activity管理及BaseActivity的实现
Ps:7-10月 完成公司两个app项目上架.漏掉的总结 开始慢慢补上. 一.写一个Activity的管理类 1.单例模式,以栈(先进后出)的形式存储Activity对象 public class A ...
- Java IO学习要点导图
Java IO的一些基础知识: 导图源文件保存地址:https://github.com/wanghaoxi3000/xmind