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.
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=1if[ a$1 =="a-R"];then recursive=" -R ";fifor i in $(ls -i $recursive | awk '{print $1}'| uniq --repeated | sort);do
echo "Inode with multiple hardlinked files: $i"
first=1for foundfile in $(find .-xdev -inum $i);doif[ $first ==1];then
echo " preserving the first file: $foundfile"
first=0else
echo " deleting the redundant file: $foundfile"#rm $foundfile fidoneif[ $ask ==1];then
read -p "Delete all the rest of redundant hardlinks without asking? y/N "if[ a${REPLY,,}=="ay"];then ask=0;fifi# read -p "pause for sure"
echo
done
echo "All redundant hardlins are removed."
echo
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).
ln -n /path/to/file
Erstellt eine Datei mit dem Namenfile
im aktuellen Verzeichnis und ist eine Kurzform fürln --no-dereference /path/to/file
. Dies bedeutet, dass, wenn/path/to/file
es sich um einen symbolischen Link handelt, der neu erstellte Hardlink auf diesen Symlink anstatt auf das Ziel des Symlinks verweist.Antworten:
Sie können es mit löschen
rm
wie 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.quelle
sudo
), wenn Sie es mit dem von Ihnen angegebenen Befehl (als Superuser) erstellt haben.Ich habe dieses Skript, um redundante Hardlinks zu entfernen. Aber pass auf - es ist ziemlich gefährlich.
quelle
Funktioniert eigentlich
rm
nicht:Was funktioniert ist
unlink AZP
.quelle
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).AZP
ist ein symbolischer Link zu einem Verzeichnis (oder etwas anderem)rm AZP/
wird nicht funktionieren, weilrm
denkt, es ist ein Verzeichnis (wegen der/
am Ende). Allerdingsrm AZP
wird gut funktionieren. -1Wenn Sie nur den Link entfernen und somit die Originaldatei behalten möchten, müssen Sie den Link entfernen.
quelle
unlink(1)
? Es ist eine flache Hülle um denunlink(2)
Systemaufruf, derselbe Systemaufruf,rm(1)
der für alle Dateien verwendet wird, die keine Verzeichnisse sind.unlink
Trotz 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).