網站首頁 編程語言 正文
最近工作中遇到一個需求——刪除指定路徑下的所有空文件夾。這里的空文件夾的認定標準是:如果某個文件夾的子文件夾全是空文件夾,也認為該文件夾是空文件夾。
代碼
以下是我實現的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
原文鏈接:https://tomcat.blog.csdn.net/article/details/124413759
相關推薦
- 2024-07-15 arthas操作spring被代理目標對象命令速查
- 2022-06-19 Rainbond使用Dockerfile構建便捷應用運行流程_云其它
- 2023-04-14 python使用pyodbc連接sqlserver_python
- 2022-05-25 SpringCloud和微服務之間的關系
- 2022-10-14 Springboot整合Netty提供WebSocket服務
- 2022-11-11 Go?time包AddDate使用解惑實例詳解_Golang
- 2022-08-12 C#?Unicode編碼解碼的實現_C#教程
- 2021-11-21 關于.NET6?Minimal?API的使用方式詳解_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支