Wie lösche ich einen Hardlink?


23

Kürzlich habe ich einen Link mit folgendem erstellt:

sudo ln -n originalFileLocation

Wie lösche ich einen Hardlink?


4
FYI: ln -n /path/to/fileErstellt eine Datei mit dem Namen fileim aktuellen Verzeichnis und ist eine Kurzform für ln --no-dereference /path/to/file. Dies bedeutet, dass, wenn /path/to/filees sich um einen symbolischen Link handelt, der neu erstellte Hardlink auf diesen Symlink anstatt auf das Ziel des Symlinks verweist.
Lekensteyn

Antworten:


37

Sie können es mit löschen rmwie gewohnt: rm NameOfFile. Beachten Sie, dass bei festen Verknüpfungen kein Unterschied zwischen "der Originaldatei" und "der Verknüpfung mit der Datei" besteht: Sie haben nur zwei Namen für dieselbe Datei, und wenn Sie nur einen der Namen löschen, wird der andere nicht gelöscht.


2
Außerdem müssen Sie es als root rm (verwenden sudo), wenn Sie es mit dem von Ihnen angegebenen Befehl (als Superuser) erstellt haben.
Rafał Cieślak

3
@ RafałCieślak: Falsch. Alle Hardlinks zu einem Inode haben dieselben Zugriffsberechtigungen wie der Inode. Um einen Verzeichniseintrag einer Datei zu löschen, dh die Verknüpfung zu lösen, benötigen Sie Schreibberechtigungen für den Inode dieser Datei und für das Verzeichnis, das den Eintrag enthält, den Sie löschen möchten. Daher ist es unerheblich, welche Berechtigungen zum Erstellen der festen Verbindung verwendet wurden. Möglicherweise sind sie (noch) die gleichen wie zum Zeitpunkt der Erstellung.
David Foerster

2

Ich habe dieses Skript, um redundante Hardlinks zu entfernen. Aber pass auf - es ist ziemlich gefährlich.

#!/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

Funktioniert eigentlich rmnicht:

[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

Was funktioniert ist unlink AZP.


2
Bist du sicher, dass es sich bei deiner um eine harte Verbindung handelt? Harte Links sind wie Dateien.
Seth

@Seth, eigentlich erinnere ich mich nicht, was das war, aber es will nicht entfernt werden, wie Sie sehen konnten. Jemand sagte mir, ich solle Unlink verwenden, und es hat funktioniert. :)
Bunyk

Das liegt wahrscheinlich daran, dass AZP eine Datei und kein Verzeichnis war, aber ohne weitere Informationen konnte ich nicht sicher sein. Unlink sollte aber immer funktionieren, also keine Probleme da.
Seth

1
AZP/sieht aus wie ein Verzeichnis, rm bearbeitet keine Verzeichnisse ohne das rekursive Flag. Auch nach den coreutills docs. >>> Die meisten Systeme verbieten das Herstellen einer festen Verbindung zu einem Verzeichnis. Wenn dies zulässig ist, kann dies nur der Superuser (und dies mit Vorsicht, da das Erstellen eines Zyklus bei vielen anderen Dienstprogrammen zu Problemen führt).
ThorSummoner

2
Hardlinks zu Verzeichnissen sind verboten. Wenn AZPist ein symbolischer Link zu einem Verzeichnis (oder etwas anderem) rm AZP/wird nicht funktionieren, weil rmdenkt, es ist ein Verzeichnis (wegen der /am Ende). Allerdings rm AZPwird gut funktionieren. -1
David Foerster

0

Wenn Sie nur den Link entfernen und somit die Originaldatei behalten möchten, müssen Sie den Link entfernen.


Hast du was gelesen unlink(1)? Es ist eine flache Hülle um den unlink(2)Systemaufruf, derselbe Systemaufruf, rm(1)der für alle Dateien verwendet wird, die keine Verzeichnisse sind.
David Foerster

1
Diese Antwort ist irreführend. Bei fest verknüpften Dateien gibt es keinen Unterschied zwischen "Verknüpfung" und "Originaldatei". Alle Hardlinks verweisen auf dieselbe Datei / denselben Inhalt / denselben Inode, der durch verschiedene Verzeichniseinträge dargestellt wird. unlinkTrotz des Namens wird ein fest verknüpfter Ordner nicht in zwei separate Dateien aufgeteilt, sondern der "nicht verknüpfte" Verzeichniseintrag entfernt (nicht jedoch die Datei / content / inode, solange die Anzahl der Verknüpfungen> 1 ist).
Murphy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.