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

本文介绍两个实用的Shell脚本,分别用于从上至下和从下至上批量删除Linux系统中的空文件夹,提供了详细的脚本实现及使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

代码

以下是我实现的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

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sinat_40572875

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值