如何删除硬链接?


23

最近,我创建了一个包含以下内容的链接:

sudo ln -n originalFileLocation

如何删除硬链接?


4
仅供参考:在当前目录中ln -n /path/to/file创建一个名为的文件file,是的简写ln --no-dereference /path/to/file。这意味着,如果/path/to/file是符号链接,则新创建的硬链接将指向该符号链接,而不是符号链接的目标。
Lekensteyn 2011年

Answers:


37

您可以rm照常删除它:rm NameOfFile。请注意,使用硬链接时,“原始文件”和“到文件的链接”之间没有区别:同一文件只有两个名称,仅删除其中一个名称不会删除另一个。


2
另外sudo,如果使用提供的命令(以超级用户身份)创建它,则需要以root用户身份使用它(使用)。
2011年

3
@RafałCieślak:错。到索引节点的所有硬链接都共享与索引节点相同的访问权限。要删除文件的目录条目(即“取消链接”),您需要对该文件的索引节点以及包含要删除的条目的目录具有写权限。因此,使用哪些特权来创建硬链接是无关紧要的。它们可能恰好与创建时相同。
David Foerster

2

我有这个脚本来删除多余的硬链接。但是请注意-这非常危险。

#!/bin/bash
clear
echo Reduce redundant hardlinks in the current folder
echo ------------------------------------------------
echo 
echo "  $(basename $0) [-R]"
echo "      -R means recursive"
echo 
read -p "You can break by pressing Ctrl+C"
echo
ask=1
if [ a$1 == "a-R" ]; then  recursive=" -R "; fi

for i in $(ls -i $recursive | awk '{print $1}' | uniq --repeated | sort); 
do 
    echo "Inode with multiple hardlinked files: $i"
    first=1
    for foundfile in $(find . -xdev -inum $i);
    do 
        if [ $first == 1 ]; then
            echo "  preserving the first file:  $foundfile"
            first=0
        else
            echo "  deleting the redundant file:    $foundfile"  
            #rm $foundfile  
        fi
    done 
    if [ $ask == 1 ]; then 
        read -p "Delete all the rest of redundant hardlinks without asking? y/N "
        if [ a${REPLY,,} == "ay" ]; then  ask=0; fi
    fi  
#   read -p "pause for sure"
    echo
done
echo "All redundant hardlins are removed."
echo

1

实际上rm不起作用:

[user@localhost Products]$ rm AZP/
rm: cannot remove `AZP/': Is a directory
[user@localhost Products]$ rm -r AZP/
rm: cannot remove `AZP': Not a directory

什么是有效的unlink AZP


2
您确定您的链接很硬吗?硬链接就像文件iirc。
赛斯

@Seth,实际上我不记得那是什么,但是正如您所看到的,它不想删除。有人告诉我使用取消链接,它起作用了。:)
Bunyk 2014年

这可能是因为AZP是文件而不是目录,但是我不确定没有更多信息。取消链接应该始终可以正常工作,因此那里没有问题。
赛斯2014年

1
AZP/看起来像一个目录,如果没有递归标志,rm不会在目录上运行。也根据coreutills文档。>>>大多数系统禁止建立到目录的硬链接。在允许的情况下,只有超级用户才能这样做(并且要谨慎,因为创建周期会给许多其他实用程序带来问题)。
ThorSummoner

2
禁止硬链接到目录。如果AZP是,则指向目录(或其他任何目录)的符号链接rm AZP/将不起作用,因为rm它认为它是目录(由于/末尾为)。但是rm AZP将正常工作。-1
David Foerster

0

如果您只想删除链接从而保留原始文件,则必须使用取消链接。


你读过什么unlink(1)吗?它是围绕unlink(2)系统调用的浅层包装,该系统调用rm(1)用于非目录的所有文件。
David Foerster,2016年

1
这个答案是误导的。对于硬链接文件,“链接”和“原始文件”之间没有区别;所有硬链接都引用相同的文件/内容/索引节点,由不同的目录条目表示。unlink,尽管有名称,但不会将硬链接分为两个单独的文件,而是删除“未链接”目录条目(但文件/内容/索引节点(只要链接计数> 1)就不会删除)。
墨菲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.