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

更新时间:2022-10-25 10:05:04

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

代码

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

#!/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文件中。

516994798806d54104363b59ba3c124e_2022102414092010_202292414949.png

总结

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

补充

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

需求

在工作中遇到一个需求:

  • 删除一个指定的文件夹,如果删除后,其上一层文件夹也是空文件夹,则也删除其上一层文件夹;

  • 如果删除其上一层文件夹后,上一层文件夹的再上一层文件夹也是空,也删除再上一层文件夹;

  • 依次类推,直到删除到一个指定的文件层级;

  • shell脚本实现;

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

实现

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

代码

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

Linux