
答案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
遞歸刪除目錄及其內容。