Linux實(shí)現(xiàn)徹底清理空文件夾的方法詳解
最近工作中遇到一個(gè)需求——刪除指定路徑下的所有空文件夾。這里的空文件夾的認(rèn)定標(biāo)準(zhǔn)是:如果某個(gè)文件夾的子文件夾全是空文件夾,也認(rèn)為該文件夾是空文件夾。
代碼
以下是我實(shí)現(xiàn)的shell腳本,自測沒有發(fā)現(xiàn)異常。
#!/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}個(gè)空文件夾。"
done
echo "進(jìn)行了${deleteTime}輪清理,總共刪除了${emptyDirNumForAll}個(gè)空文件夾。"
}
delete_empty_dirs "$1"
使用方法
在需要Linux中,將代碼通過vim或者cat寫入到一個(gè)shell腳本文件,如clean.sh,并通過chmod +x賦予該文件可執(zhí)行權(quán)限,然后通過./<腳本文件名> <待清理的路徑>執(zhí)行清理任務(wù) 。例如./clean.sh /root/geoscene/geoscene ,注意路徑的最后不要帶/。
測試效果
本文的腳本會(huì)統(tǒng)計(jì)最后刪除了多少個(gè)空文件夾,并將全部的刪除記錄打印到控制臺,同時(shí)將刪除文件清單輸出到腳本所在文件夾下的output.txt文件中。

總結(jié)
本腳本通過循環(huán)和遞歸將整個(gè)任務(wù)分解成一輪一輪的清理任務(wù),直到再也找不到空文件夾為止。實(shí)現(xiàn)方式比較暴力,沒有考慮時(shí)間復(fù)雜度。如果您有更優(yōu)的解決方案,歡迎通過留言評論進(jìn)行交流。
補(bǔ)充
當(dāng)然Linux還可以實(shí)現(xiàn)自下而上的刪除空文件夾,下面是實(shí)現(xiàn)方法
需求
在工作中遇到一個(gè)需求:
- 刪除一個(gè)指定的文件夾,如果刪除后,其上一層文件夾也是空文件夾,則也刪除其上一層文件夾;
- 如果刪除其上一層文件夾后,上一層文件夾的再上一層文件夾也是空,也刪除再上一層文件夾;
- 依次類推,直到刪除到一個(gè)指定的文件層級;
- shell腳本實(shí)現(xiàn);
簡單地說就是要自下而上地刪除Linux的空文件夾。
實(shí)現(xiàn)
以下是完成的shell方法,,經(jīng)過測試,能正常使用。
代碼
delete_empty_dir(){
fromDirInDED="$1"
toDirInDED=$2
if [ "$fromDirInDED" = "" ] || [ "$toDirInDED" = "" ] || [ ${#fromDirInDED} -lt ${#toDirInDED} ] ; then
echo "delete_empty_dir方法參數(shù)錯(cuò)誤。"
return 1
fi
if [ ! -d "$fromDirInDED" ]; then
echo "文件夾不存在:${fromDirInDED} 。"
return 1
fi
if [ "$fromDirInDED" = "$toDirInDED" ]; then
echo "抵達(dá)最終文件層級。"
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
}
使用說明
該方法需要兩個(gè)參數(shù),第一個(gè)參數(shù)為需要?jiǎng)h除的最下一層文件夾的絕對路徑,該文件夾無論是不是為空,都會(huì)被刪除,第二個(gè)參數(shù)為停止刪除的文件夾的絕對路徑。
如:需要?jiǎng)h除/root/myApps/laoWang/CSDN/blogs/test/shell目錄,并判定其上層文件夾是否為空文件夾,如果為空也將刪除,直到/root/myApps/laoWang才停止刪除操作。
那么完成上述需求的執(zhí)行代碼為:delete_empty_dir /root/myApps/laoWang/CSDN/blogs/test/shell /root/myApps/laoWang
到此這篇關(guān)于Linux實(shí)現(xiàn)徹底清理空文件夾的方法詳解的文章就介紹到這了,更多相關(guān)Linux清理空文件夾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell腳本實(shí)現(xiàn)的一個(gè)簡易Web服務(wù)器例子分享
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)的一個(gè)簡易Web服務(wù)器例子分享,本文實(shí)現(xiàn)的Web服務(wù)器非常簡單實(shí)用,可以在你不想安裝nginx、apache等大型WEB服務(wù)器時(shí)使用,需要的朋友可以參考下2014-12-12
Linux下使用nextcloud搭建個(gè)人網(wǎng)盤代碼實(shí)例
這篇文章主要介紹了Linux下使用nextcloud搭建個(gè)人網(wǎng)盤代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06
如何短時(shí)間內(nèi)學(xué)好一門語言 shell腳本語言為例
這篇文章主要以shell腳本語言為例,為大家介紹了如何短時(shí)間內(nèi)學(xué)好一門語言,感興趣的小伙伴們可以參考一下2016-09-09

