如何通过删除所有文件和硬链接来声明磁盘空间?

如何通过删除所有文件和硬链接来声明磁盘空间?

我已经尝试了几个小时来解决这个问题,但似乎无法做到

我的问题是我的文件名很简单,里面有 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递归删除目录及其内容。

相关内容