Ich halte meine Punktedateien unter Versionskontrolle und das Skript, das sie bereitstellt, erstellt feste Links. Ich benutze auch etckeeper
, um meine /etc
unter Versionskontrolle zu setzen . Vor kurzem habe ich Warnungen wie diese erhalten:
warning: hard-linked files could cause problems with bzr
Eine einfache Kopie ( cp filename.ext filename.ext
) funktioniert nicht:
cp: `filename.ext' and `filename.ext' are the same file
Das Umbenennen / Verschieben einer Datei - außer über mehrere Volumes hinweg - unterbricht auch nicht die feste Verbindung.
Meine Frage lautet also: Gibt es eine Möglichkeit, einen Hardlink zu einer Datei zu unterbrechen, ohne tatsächlich wissen zu müssen, wo sich die anderen Hardlinks zu dieser Datei befinden?
Antworten:
Skriptfähig machen:
Wenn Sie die Kopie zuerst erstellen und dann an ihren Platz verschieben, hat dies den Vorteil, dass sich die Datei atomar von einer festen Verknüpfung zu einer separaten Kopie ändert (es gibt keinen Zeitpunkt, an dem sie
filename
teilweise vorhanden ist oder fehlt).quelle
Sie meinen wahrscheinlich, dass Sie den Hardlink in eine separate, unabhängige Datei aufteilen möchten.
Ein Hardlink ist die Verbindung zwischen einem Eintrag im Verzeichnis und dem Inode-Block auf der Festplatte.
Inodes speichern Datei-Metadaten, und für kleine Dateien speichern einige Dateisysteme Daten im Inode, andernfalls Zeiger auf die Datenblöcke und für sehr große Dateien indirekte und doppelt indirekte Listen von Zeigern auf Plattenzuordnungseinheiten.
Unabhängig davon wird die Verbindung zwischen dem Dateinamen (den der Befehl ls erzeugt) und dem Inode-Block, in dem diese Metadaten gespeichert sind, als fester Link bezeichnet.
Mehrere feste Links zu einer einzelnen Datei bedeuten, dass derselbe Inode von mehr als einem Verzeichniseintrag referenziert wird, möglicherweise in verschiedenen Verzeichnissen (in einem einzelnen Dateisystem).
rm löscht den Dateinameneintrag aus dem Verzeichnis. Sobald ein Inode nicht mehr von Dateien referenziert wird, wird sein Speicherplatz für die Verwendung durch andere Dateien freigegeben.
quelle
cp
undmv
Beispiele implizierten. Ich verstehe also, dass es keinen Weg gibt, eine temporäre Datei zu verwenden.cp -a
(mindestens GNU Coreutils).Fügen Sie dies am Ende Ihrer ~ / .bashrc-Datei ein.
Führen Sie es so aus
quelle
Der beste Weg, dies mit einem Bash-Skript zu tun, wäre ungefähr so:
Punkte zu beachten:
mktemp
diese Option, um eine Datei zu generieren, die garantiert nicht vorhanden ist-f
diese Option--preserve=all
, um das Überschreiben zu erzwingen und die Metadaten der Originaldatei so ähnlich wie möglich zu halten--
und"
, um Pfade zu zitieren, die Leerzeichen enthalten und / oder mit beginnen-
Das Ersetzen ohne Erstellen einer temporären Datei ist mit aktuellen (3.16) Linux-Systemaufrufen nicht möglich: Während es möglich ist, eine Datei atomar zu überschreiben (dh die alte Datei zu entfernen und als einzelne Operation durch eine neue zu ersetzen), ist dies möglich ist nicht möglich , dies mit einer Datei zu tun , die auf dem Dateisystem keinen Namen (dh eine temporäre Datei erstellt unter Verwendung der hat
O_TMPFILE
Flaggeopen
Funktion) , da dierename
Funktion einen Dateinamen als Eingang (es erforderlich ist keine Version vonrename
dem als Eingabe - Descriptor eine Datei nimmt - siehe hier für Details)quelle
dirname
undmktemp
Anrufen nicht angegeben haben.$( ... )
Ersetzung des Befehls -style. Ein Grund, warum es schöner ist als` ... `
Stil.`
Sie dazu zu bringen:`\``
(Natürlich bin ich dem doppelt entkommen, damit es Ihnen zeigt, was Sie eingeben).Der Befehl, den Sie suchen, ist
unlink
quelle
cp
undmv
ich wollte klarstellen, dass ich möchte, dass die Datei danach existiert.Wenn Sie nach allen Dateinamen suchen, die mit dieser Datei verknüpft sind, können Sie Folgendes verwenden:
Außerdem
ls -il myknowhardlinkfile
wird die Anzahl der Dateinamen angezeigt, die mit demselben Inode verknüpft sind (drittes Feld).quelle