答案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
递归删除目录及其内容。