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

我想删除特定文件的所有硬链接。
使用方法是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

但正如我上面所说的,这将删除原始文件,那么如何保留第一个实例并删除其他实例呢?
2个回答

你可以使用带有原始文件路径的!来排除它:
$ 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
    

这适用于绝对路径和相对路径的文件名,而且不会打印任何“权限被拒绝”的对话框。当删除失败时,它会打印“删除失败:<文件名>”。
find / -samefile "$1" \! -path "${PWD}/$1" \! -delete -printf 'Deletion failed: %p\n' 2>/dev/null