如何透過刪除所有檔案和硬連結來聲明磁碟空間?

如何透過刪除所有檔案和硬連結來聲明磁碟空間?

我已經嘗試了幾個小時來解決這個問題,但似乎無法做到

我的問題是我的檔案名稱很簡單,裡面有 4 個不同的子目錄 在此輸入影像描述

現在我要做的就是刪除 foo 下的所有內容(包括硬連結)並回收 foo 的所有磁碟空間。

我嘗試透過鍵入刪除所有檔案。

rm 富/*

但它不會刪除其他子目錄中的硬連結。

然後我嘗試查看是否匹配 inode

查找 foo -type f -ls |種類

這就是我用這個命令得到的

在此輸入影像描述

此指令不顯示其他子目錄,僅顯示 foo/

有人可以幫我嗎?謝謝。

答案1

foo如果您想使用 GNU 工具刪除與透過 Descending 找到的任何文件硬連結的所有文件,您可以這樣做:

dir=foo
mountpoint=$(df --output=target -- "$dir" | tail -n +2)

awk -v RS='\0' -v ORS='\0' '
  ARGIND == 1 {inum[$0]; next}
  {i=$0; getline}
  i in inum
 ' <(find -- "$dir" -xdev ! -type d -links +1 -printf '%i\0') \
   <(find -- "$mountpoint" -xdev ! -type d -printf '%i\0%p\0') |
  xargs -r0 rm -f

rm -rf -- "$dir"

假設有 GNU df、 GNU awk、 GNU和像 GNU shell ( ) 這樣支援進程替換 ( )find的 shell 。bash<(...)

這也假設$dir不以謂詞開頭-或恰好不是find謂詞(例如!(...)。

上面我們在整個檔案系統上尋找文件$dir所屬的。您可以僅替換為(在本例中)$mountpoint的父目錄或其他目錄$dir.子目錄123 ABC def這裡)如果您知道所有硬連結都只在那裡。

在上面的程式碼中,我們記錄了透過降序找到的所有連結計數大於1的非目錄檔案的inode號$dir。並在整個檔案系統中尋找那些索引節點號(至少是未被其他檔案系統封鎖並且您有權遍歷的部分)。索引節點號對於每個檔案系統來說都是唯一的,因此我們使用它-xdev來確保只掃描$dir找到的一個檔案系統。

答案2

rm -rf foo

rm- 刪除檔案或目錄。

  • -f忽略不存在的文件和參數,從不提示。
  • -r遞歸刪除目錄及其內容。

相關內容