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

目录
  • 代码
  • 使用方法
  • 测试效果
  • 总结
  • 补充

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

代码

以下是我实现的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文件中。

总结

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

补充

当然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实现彻底清理空文件夹的方法详解的文章就介绍到这了,更多相关Linux清理空文件夹内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux中文件/文件夹无法删除的解决方案

    前言 最近我们的服务器被黑客攻击,然后有些文件的属性被修改,导致我们无法删除病毒文件,同时采用 root 用户也无法删除,现在把解决方案记录下来. 普通删除 如果文件是当前用户的,那么使用 rm 命令就可以删除 rm -rf file.sh 如果无法删除,则尝试使用 root 用户删除,如果无法删除那么请看下面的说明. 需要了解的命令 如果普通的删除方式没有用,那么我们需要了解下面的命令来进行删除 lsattr lsattr 命令用于显示文件的属性,使用方式如下 # 列出 file.sh 文件的

  • Linux系统删除文件夹和文件的命令

    linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可. 直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字 -r 就是向下递归,不管有多少级目录,一并删除 -f 就是直接强行删除,不作任何提示的意思 删除文件夹实例: rm -rf /var/log/httpd/access 将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 删除文件使用实例: rm -f /var/log/htt

  • Linux Shell获取文件夹下的文件名方法

    有时候需要获取某个文件夹下的所有文件名,可以用程序实现,但是打开IDE,编译运行太麻烦,在Linux服务器中通常不能打开IDE,此时可以用几行简单的shell命令来实现,结果保存到某个文件中即可. Shell脚本如下: #!/bin/bash # get all filename in specified path path=$1 files=$(ls $path) for filename in $files do echo $filename >> filename.txt done 以上

  • Linux服务器删除文件夹、删除文件、解压命令的方法

    一.删除文件夹 例:rm -rf /usr/java 将会删除/usr/java目录以及其下所有文件.文件夹 二.删除文件 例:rm -f /usr/tomcat/conf/server.xml 将会强制删除/usr/tomcat/conf/server.xml这个文件 三.解压 1. 解压到当前目录 例:tar -zxvf jdk-8u131-linux-x64.tar.gz 会将jdk-8u131-linux-x64.tar.gz解压到其所在的当前目录下 以上这篇Linux服务器删除文件夹.

  • linux下上传下载文件夹的方法

    Linux下目录复制:本机->远程服务器 scp -r /home/shaoxiaohu/test1 zhidao@192.168.0.1:/home/test2 test1为源目录,test2为目标目录,zhidao@192.168.0.1为远程服务器的用户名和ip地址. Linux下目录复制:远程服务器->本机 scp -r zhidao@192.168.0.1:/home/test2 /home/shaoxiaohu/test1 zhidao@192.168.0.1为远程服务器的用户名和

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

    目录 代码 使用方法 测试效果 总结 补充 最近工作中遇到一个需求——删除指定路径下的所有空文件夹.这里的空文件夹的认定标准是:如果某个文件夹的子文件夹全是空文件夹,也认为该文件夹是空文件夹. 代码 以下是我实现的shell脚本,自测没有发现异常. #!/bin/bash delete_empty_dirs_once(){ local dirPath=$1 if [ ! -d "${dirPath}" ]; then echo "文件夹不存在:${dirPath}"

  • Python删除空文件和空文件夹的方法

    本文实例讲述了Python删除空文件和空文件夹的方法.分享给大家供大家参考.具体实现方法如下: #-*- coding:cp936 -*- """ os.walk() 函数声明:walk(top,topdown=True,onerror=None) 1>参数top表示需要遍历的目录树的路径 2>参数topdown的默认值是"True",表示首先返回目录树下的文件,然后在遍历目录树的子目录.Topdown的值为"False"时

  • Python简单实现自动删除目录下空文件夹的方法

    本文实例讲述了Python简单实现自动删除目录下空文件夹的方法.分享给大家供大家参考,具体如下: 总是发现电脑用上一段时间,各种软件生成各种目录,可是这些目录都是空文件夹,感觉没用,或许有些许强迫症吧,每次看到都会去删除掉他们,有时候真的太多了,让人删除起来就蛋疼,最近学习Python,特别希望搞些有用的小脚本,然后就开始使用python搞起了这个小脚本的编写. 因为完全是个初学者,所以写起脚本来,各种百度,google,可到最后我写的脚本也不能达到我的目的,只能删除一级目录下的空文件夹,而子目

  • php7基于递归实现删除空文件夹的方法示例

    本文实例讲述了php7基于递归实现删除空文件夹的方法.分享给大家供大家参考,具体如下: php版本7.0.4 代码如下: <?php $path = 'd:/'; rmDir_1($path); function rmDir_1($path) { $files = scandir($path); // 删除当前目录和上一级目录 foreach($files as $key => $file) { if ( $file == '.' || $file == '..') { unset($file

  • linux网站服务Apache的安装与配置方法详解

    这篇文章介绍下linux网站服务apache的安装与配置方法,包括挂载光盘,安装http服务,管理httpd服务,httpd的配置文件几大部分.具体详情可以参考下文. 1.挂载光盘 自己习惯将光盘挂载在/media/cdrom目录,在做本地yum源的时候此目录为默认目录之一 [root@localhost /]# mount /dev/cdrom /media/cdrom/ 2.安装httpd服务(如果本地yum源已经搭建好就直接进行这一步,没有的话需要搭建,前面的文章有提到yum源的搭建) [

  • Linux手动部署远程的mysql数据库的方法详解

    一.安装mysql 运行以下命令更新YUM源. rpm -Uvh  http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm 运行以下命令安装MySQL. yum -y install mysql-community-server 运行以下命令查看MySQL版本号. mysql -V 返回结果如下,表示MySQL安装成功. mysql  Ver 14.14 Distrib 5.7.31, for Linux (x86_

  • Linux查看日志文件写入速度的4种方法详解

    目录 简介 使用dd 使用pv 使用cv命令 编写小脚本 举一反三 简介 有时,我们需要查看某个文件的增长速度,如日志文件,以此来感受系统的负载情况,因为一般情况下,日志写入越快,说明系统负载越重. 本文就来介绍下Linux中查看日志增长速度的几种方法,如下: 使用dd 首先要介绍的是dd,因为dd命令几乎所有主流发行版都自带,无需额外安装,如下: $ tail -F app.log | dd of=/dev/null status=progress 3875840 bytes (3.9 MB)

  • 利用bat批处理程序通过DOS命令行删除所有的空文件夹的方法

    用过gothub或者码云的同学都知道,不包含任何文件的空文件夹上传提交时不被允许的.当然你可以在空文件下创建.keep文件(或.gitkeep文件),然后就可以上传了. 但是如果空文件夹比较多,并且我们确实不需要这些空文件了,那本文就学习一种命令行删除所有空文件夹的方法.并封装成.bat批处理程序.通过鼠标右键运行即可. 一,DOS删除命令 1.1,删除文件命令 del 若是想删除文件,输入del 盘符名:\文件名,比如,我想删除一个在F盘的名为123.txt的文件,则输入  del f:\12

  • Linux中利用sudo进行赋权的方法详解

    前言 学习怎么在保护 root 密码的安全性的同时,为可信用户赋予所管理的网络功能和特定服务的权限. 我最近写了一个简短的 Bash 程序来将 MP3 文件从一台网络主机的 USB 盘中拷贝到另一台网络主机上去.拷贝出来的文件存放在一台志愿者组织所属服务器的特定目录下,在那里,这些文件可以被下载和播放. 我的程序还会做些其他事情,比如为了自动在网页上根据日期排序,在拷贝文件之前会先对这些文件重命名.在验证拷贝完成后,还会删掉 USB 盘中的所有文件.这个小程序还有一些其他选项,比如 -h 会显示

  • Linux中使用NTP保持精确时间的方法详解

    前言 如何保持正确的时间,如何使用 NTP 和 systemd 让你的计算机在不滥用时间服务器的前提下保持同步.下面话不多说了,来一起看看详细的介绍吧. 它的时间是多少? 让 Linux 来告诉你时间的时候,它是很奇怪的.你可能认为是使用 time 命令来告诉你时间,其实并不是,因为 time 只是一个测量一个进程运行了多少时间的计时器.为得到时间,你需要运行的是 date 命令,你想查看更多的日期,你可以运行 cal 命令.文件上的时间戳也是一个容易混淆的地方,因为根据你的发行版默认情况不同,

随机推荐