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清理空文件夹内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!