shell递归遍历目录删log

批量删除文件与目录的Shell脚本实践
本文介绍了两个Shell脚本示例,用于递归删除特定类型的文件和目录。Example1展示了如何删除以.e或.o为扩展名且带有数字的文件,以及通过grep和正则表达式筛选。Example2则演示了如何删除events.out.tfevents.*和.pth文件,同时打印遍历的目录结构,并屏蔽ls和rm的错误输出。这两个脚本在清理工作目录或自动化任务中非常实用。

Example 1

  • 遍历删 *.e<一串数字>*.o<一串数字> 文件,在 grep 用正则表达式筛选要删的文件[2,3]
#!bin/bash

clean()
{
    echo "->" cleaning: $1
    ls -d $1/* | grep -E "*.[oe][0-9]+" | xargs rm
    for f in `ls -a $1`; do
        if [ -d $1/$f ]; then
            if [[ $f != '.' && $f != '..' ]]; then
                clean $1/$f
            fi
        fi
    done
}

clean $(pwd)

Example 2

  • 递归删 events.out.tfevents.**.pth,同时打印遍历的目录结构(用 printf 格式化输出)。
  • 2>/dev/null 屏蔽 lsrm 在无匹配时的报错输出[9]rm 也可以用 -f 参数,但这用起来有点怕删错。(windows 下的屏蔽见 [10,11])
  • 启用 set -e,因为 lsrm 虽然被屏蔽输出,在无匹配时依然会报错,如果用了 set -e 就可能会因为报错中途退出。
#!/bin/bash

# set -e  # 关掉,否则会因 ls、rm 在无匹配时的报错而退出

clean()
{
    # print directory tree
    if [ $2 -gt 1 ]; then
        printf "|  %.0s" $(seq 2 $2)
    fi
    if [ $2 -gt 0 ]; then
        printf "|- "
    fi
    echo $1/

    # clean log
    cd $1
    rm events.out.tfevents.* 2>/dev/null
    rm *.pth 2>/dev/null
    for d in `ls -d */ 2>/dev/null`; do
        clean `basename $d` `expr $2 + 1`
    done
    cd ..

    # remove folder if it's empty
    rmdir $1 2>/dev/null
}

for d in `ls -d */ | grep log`; do
    clean `basename $d` 0
done

References

  1. SHELL递归遍历文件夹下所有文件
  2. rm 使用正则表达式 删除文件
  3. shell|rm 使用正则表达式过滤出要删除的文件
  4. Linux Shell 只列出目录的方法
  5. Linux shell 之 提取文件名和目录名的一些方法
  6. Shell printf 命令
  7. How can I repeat a character in Bash?
  8. Linux command to repeat a string n times
  9. How to “mute” ls command?
  10. Suppress command line output
  11. dos bat批量创建软链接
  12. dos递归遍历目录删log
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值