最近工作中遇到一个需求——删除指定路径下的所有空文件夹。这里的空文件夹的认定标准是:如果某个文件夹的子文件夹全是空文件夹,也认为该文件夹是空文件夹。
代码
以下是我实现的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清理空文件夹内容请搜索aitechtogether.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持aitechtogether.com!