广告位联系
返回顶部
分享到

Linux实现彻底清理空文件夹的方法

linux shell 来源:互联网 作者:秩名 发布时间:2022-10-26 22:17:03 人浏览
摘要

最近工作中遇到一个需求删除指定路径下的所有空文件夹。这里的空文件夹的认定标准是:如果某个文件夹的子文件夹全是空文件夹,也认为该文件夹是空文件夹。 代码 以下是我实现

最近工作中遇到一个需求——删除指定路径下的所有空文件夹。这里的空文件夹的认定标准是:如果某个文件夹的子文件夹全是空文件夹,也认为该文件夹是空文件夹。

代码

以下是我实现的shell脚本,自测没有发现异常。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

#!/bin/bash

delete_empty_dirs_once(){

  local dirPath=$1

 

  if [ ! -d "${dirPath}" ]; then

      echo  "文件夹不存在:${dirPath}"

      return 0

  fi

 

  local lsStrInDEDO=$(ls -a "${dirPath}")

  local arrayInDEDO=(${lsStrInDEDO})

 

  if [  ${#arrayInDEDO[@]} -le 2 ]; then

      rm -rf "${dirPath}"

      echo "删除空文件夹:${dirPath}"

      echo "${dirPath}" >>empty_dirs.txt

      emptyDirNumForOnce=$(($emptyDirNumForOnce+1))

      emptyDirNumForAll=$(($emptyDirNumForAll+1))

      return 1

  else

      local flag=0

      for item in "${arrayInDEDO[@]}";do

        local itemPath="${dirPath}/${item}"

        if [ "$item" != "."  ] && [ "$item" != ".." ] && [ -d "${itemPath}"  ]; then

            delete_empty_dirs_once "${dirPath}/${item}"

            if [ $? -eq 1  ]; then

                flag=1

            fi

        fi

      done

      return $flag

  fi

}

 

delete_empty_dirs(){

  local topDirPath=$1

  if [ ! -d "${topDirPath}" ]; then

      return 1

  fi

  emptyDirNumForAll=0

  deleteTime=0

  local  flag=1

  while [ $flag -eq  1 ]; do

    emptyDirNumForOnce=0

    deleteTime=$(($deleteTime+1))

    delete_empty_dirs_once "${topDirPath}"

    flag=$?

    echo "第${deleteTime}轮清理,删除了${emptyDirNumForOnce}个空文件夹。"

  done

  echo "进行了${deleteTime}轮清理,总共删除了${emptyDirNumForAll}个空文件夹。"

 

}

 

delete_empty_dirs "$1"

使用方法

在需要Linux中,将代码通过vim或者cat写入到一个shell脚本文件,如clean.sh,并通过chmod +x赋予该文件可执行权限,然后通过./<脚本文件名> <待清理的路径>执行清理任务 。例如./clean.sh /root/geoscene/geoscene ,注意路径的最后不要带/。

测试效果

本文的脚本会统计最后删除了多少个空文件夹,并将全部的删除记录打印到控制台,同时将删除文件清单输出到脚本所在文件夹下的output.txt文件中。

总结

本脚本通过循环和递归将整个任务分解成一轮一轮的清理任务,直到再也找不到空文件夹为止。实现方式比较暴力,没有考虑时间复杂度。如果您有更优的解决方案,欢迎通过留言评论进行交流。

补充

当然Linux还可以实现自下而上的删除空文件夹,下面是实现方法

需求

在工作中遇到一个需求:

  • 删除一个指定的文件夹,如果删除后,其上一层文件夹也是空文件夹,则也删除其上一层文件夹;
  • 如果删除其上一层文件夹后,上一层文件夹的再上一层文件夹也是空,也删除再上一层文件夹;
  • 依次类推,直到删除到一个指定的文件层级;
  • shell脚本实现;

简单地说就是要自下而上地删除Linux的空文件夹。

实现

以下是完成的shell方法,,经过测试,能正常使用。

代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

delete_empty_dir(){

  fromDirInDED="$1"

  toDirInDED=$2

  if [ "$fromDirInDED" = "" ] || [ "$toDirInDED" = "" ] || [ ${#fromDirInDED} -lt ${#toDirInDED} ] ; then

      echo "delete_empty_dir方法参数错误。"

      return 1

  fi

 

  if [ ! -d "$fromDirInDED" ]; then

      echo "文件夹不存在:${fromDirInDED} 。"

      return 1

  fi

 

  if [ "$fromDirInDED" = "$toDirInDED" ]; then

      echo "抵达最终文件层级。"

      return 0

  fi

 

  lsStrInDED=`ls -a ${fromDirInDED}`

  arrayInDED=(${lsStrInDED})

  if [  ${#arrayInDED[@]} -le 2 ]; then

      rm -rf "${fromDirInDED}"

      echo "删除空文件夹:${fromDirInDED}"

      delete_empty_dir `dirname ${fromDirInDED}` "${toDirInDED}"

  else

     echo "此文件夹非空:${fromDirInDED} 。"

     echo "完成空文件夹清理。"

  fi

}

使用说明

该方法需要两个参数,第一个参数为需要删除的最下一层文件夹的绝对路径,该文件夹无论是不是为空,都会被删除,第二个参数为停止删除的文件夹的绝对路径。

如:需要删除/root/myApps/laoWang/CSDN/blogs/test/shell目录,并判定其上层文件夹是否为空文件夹,如果为空也将删除,直到/root/myApps/laoWang才停止删除操作。

那么完成上述需求的执行代码为:delete_empty_dir /root/myApps/laoWang/CSDN/blogs/test/shell /root/myApps/laoWang


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://tomcat.blog.csdn.net/article/details/124413759
相关文章
  • Linux中的grep -v、-e、-E用法小结
    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜
  • Linux实现彻底清理空文件夹的方法

    Linux实现彻底清理空文件夹的方法
    最近工作中遇到一个需求删除指定路径下的所有空文件夹。这里的空文件夹的认定标准是:如果某个文件夹的子文件夹全是空文件夹,也认
  • shell脚本实现字符串的动态替换方法

    shell脚本实现字符串的动态替换方法
    我们有时候需要完成字符串的多组替换,比如需要完成以下替换 将小草替换为真是让人印象深刻 将小狗的替换为可爱的 将你听清楚了吗替
  • shell循环命令的介绍
    1. for 命令 1.1 for 命令的使用 bash shell 提供了for命令,可以创建一个遍历一系列值的循环。每次一轮循环都使用其中一个值来执行已定义好的
  • shell脚本设置日志格式的方法
    shell脚本设置日志格式 1.封装函数 #!/bin/bash function log() { echo $@ } //测试: log this is a test... log today is `date +%Y-%m-%d` 2.设置时间日志 #!/bin/bash
  • linux下shell脚本备份文件的方法实现
    1、shell自动备份 主要功能: 1)将pathSrc目录中的文件拷贝到pathDst目录中去。 具体步骤:先查询源目录和目标目录中的文件,分别存在file
  • shell脚本实现定时删除文件或文件夹
    一、删除XX天(默认10天)之前某个目录下面带.log的日志文件,并且输出文件显示删除的文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
  • shell脚本批量将文件复制到指定的文件夹下

    shell脚本批量将文件复制到指定的文件夹下
    由于线上文件比较多,选择特定的文件拿下线下进行语料标注,如果指定的文件数量太多,一个个复制就很麻烦。所以写一个shell脚本进行批
  • 在shell脚本中激活conda虚拟环境的几种方法

    在shell脚本中激活conda虚拟环境的几种方法
    在shell脚本中激活conda虚拟环境 常用命令行激活conda的env的命令有2种: 1 2 conda activate ENV_NAME source /home/zhaohuiyao/minconda3/bin/activate ENV_NAME 但是
  • Shell内置命令之exit的语法与实例
    介绍: exit 用于退出当前shell环境进程结束运行,并且可以返回一个状态码.一般使用$?可以获取状态码. 语法: 正确退出语法 exit #默认返回状态
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计