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  #输出 10echo $var1 #输出 qwertecho $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命令时的致命误区的讲述
时间: 2024-10-07 12:21:22

Shell脚本实现文件遍历和删除操作的相关文章

shell脚本—根据文件个数定时备份

最近在了解Jenkins时,出现这样一个问题:linux ext3系统目录下的子目录个数不能超过31998个(参考:http://www.xshell.net/linux/1267.html),但jenkins在不停的编译版本时,有时候几个小时就创建了30000多个日志文件夹的目录,从而要随时的清理此文件夹下的目录.于是就写了个脚本来实现自动备份功能.由于很久没有接触过shell,所以花了一天来实现,比较汗颜!主要是对shell的格式,语法之类的不是很了解,在网上找了些资料,边写边调试!废话不多

android ndk下文件遍历与删除

在做手机开发过程中,难免要进行一些本地文件管理操作,比如很多常见app如微博.微信等都有清除缓存功能,该功能就是遍历app自己的缓存目录,然后删除全部缓存文件.使用java的File类可以实现本地文件遍历及删除等等功能,如果使用ndk的方式该如何实现呢?以前写过<基于c++使用win32 api遍历文件夹>,由于android ndk平台属于linux系统,所以该方式是无法使用的.通过查找linux下文件管理相关资料,顺利实现了文件遍历与删除功能,下面为相应代码,需要包含<dirent.

(转)shell脚本之文件测试操作符及整数比较符

shell脚本之文件测试操作符及整数比较符 原文:http://www.cnblogs.com/Steward-Xu/p/6722592.html 一.文件测试操作符: 在书写测试表达式是,可以使用一下的文件测试操作符. 更多的参数可以help test或者man bash 二.字符串测试操作符: 字符串测试操作符的作用:比较两个字符串是否相同.字符长度是否为0,字符串是否为null(注:bash区分长度字符串和空字符串) "="比较两个字符串是否相同,与"=="等

使用shell脚本清空文件

使用shell脚本清空文件 在最近的项目中,会生成很多日志文件,所以需要写一个脚本来手动清空它们,下面提供几种典型方法. 方法1 代码 #!/bin/bash ##方法1 echo "" > $1 echo "$1 cleaned up." 运行截图 说明 我想大家应该注意到了文件其实并没有真正被清空,而是有一个空行. 方法2 代码 #!/bin/bash ##方法2 : > $1 echo "$1 cleaned up." 运行截图

linux shell 脚本 历史文件清理脚本,按天,按月,清理前N天的历史文件,删除指定大小历史文件,历史文件归档清理

不知道大家那有没有要清理的这个事情.需要清理目录历史文件.可能后续也会有很多其他地方需要清理历史文件,可能会用到. 我这两天空闲写了个脚本,清理比较方便,有要进行清理的大量历史文件的话可以用. 脚本用到的命令只有linux才有,像solaris等就不支持,所以只能在linux上运行.如果是nas存储的话,可以挂载到一个linux主机上跑脚本清理. 另外,脚本查找文件用的是ls,但是ls也有最大文件的限度(大概10w以内),如果每天文件很多,每天都是10w+的,运行可能提示文件数过多无法ls. 还

Shell脚本与文件的执行

1.Shell脚本程序 Shell是操作系统的"外壳",Shell为用户提供操作计算机的人机交互接口.用户对计算机的所有操作以及计算机所获得数据都是由Shell管理的. Shell 一般分2类:(1).图形Shell (2)文字Shell:Shell在操作系统上面只是一个普通的应用程序,无论其形式多么复杂,可以随需要被随时替换. 我们编程研究的是文字Shell : 命令行式, 用户登录Linux系统时,就会开启一个Shell进程为该用户提供人机交互服务:用户就可以将命令提供给Shell

shell脚本复制文件夹内容到另外的文件夹,如果存在则自动备份

有时我们需要将一个文件夹覆盖到我们的工作目录,但需要自动备份已经存在的文件,一个一个去备份太麻烦了,全部备份又没有必要.shell脚本可以很好滴完成这个任务.原文链接http://back.zhizhi123.com/?p=85 #!/bin/sh upload_dir=/alidata/www/sh/useful-shell-script/upload/ www_dir=/alidata/www/sh/useful-shell-script/www/ backexist() { filelis

Linux中的shell脚本编程——数组 ,高级字符串操作 ,高级变量 ,配置用户环境

概述: 概述: 本章节将讲述Linux中shell脚本编程的数组,高级字符串处理,高级变量和配置用户的环境. 一.函数和位置参数扩展 1.shift 命令实现在位置参数中的跳跃,会把最左边的参数挤掉     2.匿名函数的使用 第一篇:数组 一.数组的定义: 1.变量:存储单个元素的内存空间 2.数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 3.数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开

shell脚本:批量修改文件名(删除文件名中字符)

shell脚本:批量修改文件名(文件名中添加字符) 上一篇写过批量修改文件名(文件名中添加字符),工作中还存在这样的需求,批量修改文件名,删除文件名中的某些字符: 举例如下:批量改名,删除文件名中多余字符 目录下文件名为如下,要求去掉_finished. stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_finished.jpg stu_102999_4_finished.jpg stu_102999_5_finis