日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Linux實現徹底清理空文件夾的方法詳解_linux shell

作者:農民工老王 ? 更新時間: 2022-11-30 編程語言

最近工作中遇到一個需求——刪除指定路徑下的所有空文件夾。這里的空文件夾的認定標準是:如果某個文件夾的子文件夾全是空文件夾,也認為該文件夾是空文件夾。

代碼

以下是我實現的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

欄目分類
最近更新