脚本删除特定文件的所有硬链接

脚本删除特定文件的所有硬链接

我想删除特定文件的所有硬链接。

用法是script somefile,这将计算文件 somefile 的硬链接,然后它将删除所有硬链接,仅保留此文件。

命令

find / -samefile file-name | xargs rm

将执行所需的操作,但这也会删除原始文件。

您也可以使用

find / -inum Inode-number | xargs rm

但这也会删除原始文件。

我的第一个脚本版本如下

#!/bin/bash
file=$1
inode=`ls -li $file | cut -d" " -f1`

find / -inum $inode | xargs rm

但是正如我上面所说,这也会删除原始文件,那么如何保留第一个实例并删除其他实例呢?

答案1

您可以使用!原始文件的路径来排除它:

$ find . -samefile bar                   
./baz
./bar
$ find . -samefile bar ! -path "./bar"   
./baz

路径必须与find输出相匹配,因此如果从中进行搜索,请使用绝对路径/

笔记:

  • find有一个-delete命令
  • 如果与 结合xargs,则使用-print0-0

    find  . -samefile bar ! -path "./bar" -print0 | xargs -0 rm
    
  • 使用stat直接获取 inode 编号:

    $ stat -c '%i' bar
    257643
    

答案2

这适用于绝对文件名和相对文件名,并且它不会打印任何“权限被拒绝”对话框,并且Deletion failed: <filename>在删除失败时进行打印:

find / -samefile "$1" \! -path "${PWD}/$1" \! -delete -printf 'Deletion failed: %p\n' 2>/dev/null

相关内容