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