#!/bin/bash
delete_empty_dirs_once(){
localdirPath=$1
if[!-d"${dirPath}"];then
echo"文件夹不存在:${dirPath}"
return0
fi
locallsStrInDEDO=$(ls-a"${dirPath}")
localarrayInDEDO=(${lsStrInDEDO})
if[${#arrayInDEDO[@]}-le2];then
rm-rf"${dirPath}"
echo"删除空文件夹:${dirPath}"
echo"${dirPath}">>empty_dirs.txt
emptyDirNumForOnce=$(($emptyDirNumForOnce+1))
emptyDirNumForAll=$(($emptyDirNumForAll+1))
return1
else
localflag=0
foritemin"${arrayInDEDO[@]}";do
localitemPath="${dirPath}/${item}"
if["$item"!="."]&&["$item"!=".."]&&[-d"${itemPath}"];then
delete_empty_dirs_once"${dirPath}/${item}"
if[$?-eq1];then
flag=1
fi
fi
done
return$flag
fi
}
delete_empty_dirs(){
localtopDirPath=$1
if[!-d"${topDirPath}"];then
return1
fi
emptyDirNumForAll=0
deleteTime=0
localflag=1
while[$flag-eq1];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方法参数错误。"
return1
fi
if[!-d"$fromDirInDED"];then
echo"文件夹不存在:${fromDirInDED}。"
return1
fi
if["$fromDirInDED"="$toDirInDED"];then
echo"抵达最终文件层级。"
return0
fi
lsStrInDED=`ls-a${fromDirInDED}`
arrayInDED=(${lsStrInDED})
if[${#arrayInDED[@]}-le2];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
|