staging.inyokaproject.org

Feststellen, welche Datei einen "hard link" besitzt

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

weholei

Anmeldungsdatum:
7. Februar 2019

Beiträge: 311

Hallo, ich post mal hier, falls es nicht recht korrekt ist, bitte ich, den Beitrag zu verschieben.

Ich versuche seit langem etwas Ordnung in meine Foto und Musiksammlung zu bringen , Duplikate zu entfernen und gleichzeitig Platz zu sparen.

Eines der Duplikate besitzt manchmal einen aussagekräftigen Namen, das andere den von Foto vergebenen wie z.b 12345.2023

Als Programme verwende ich Czkawka und rdfind.

Die Duplikate durch symlinks zu ersetzen, erweist sich als wenig zielführend, sobald man ein Backup auf ein anderes Laufwerk macht.

Im Moment versuche ich die Option mit den Hardlinks. Mit der option -H scheint es auch zu klappen.

rsync -av -H 

Wie erkenne ich, bei der Datei z.b 12345.2023 ob ein schon benannter hardlink existiert?

ist die option ls -lc zielführend?

bei erstellen eines Hardlinky wird der "Zähler" von 1 auf 2 gesetzt, allerdins nicht zurückgesetzt wenn ich ein Duplikat mit den Krussader lösche,

-rwxr-xr-x 2

Making 1 links.
werner@ubu-20-home:~/doppelte_hard_links_test$ ls -lc
insgesamt 9860
-rwxr-xr-x 2 werner werner 5046070 Mai 24 23:08 "america - Das letzte Einhorn - Man's Road.mp3"
-rwxr-xr-x 2 werner werner 5046070 Mai 24 23:08 "america - Das letzte Einhorn - Man's Road_org.mp3"
-rw-rw-r-- 1 werner werner     372 Mai 24 23:08  results.txt

ein Duplikat gelöscht

werner@ubu-20-home:~/doppelte_hard_links_test$ ls -lc
insgesamt 4932
-rwxr-xr-x 2 werner werner 5046070 Mai 24 23:09 "america - Das letzte Einhorn - Man's Road_org.mp3"
-rw-rw-r-- 1 werner werner     372 Mai 24 23:08  results.txt
werner@ubu-20-home:~/doppelte_hard_links_test$ 

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

Sollte eigentlich funktionieren mit dem Zählen. Mach mal einen generellen Test:

# testordner anlegen und hinwechseln; datei anlegen und verlinken; mittels find Duplikate finden
mkdir /tmp/hardlinktest; cd $_; touch original; ln original hardlink; find . -samefile original

Wenn du dann eine der beiden Dateien mit rm löschst, sollte der Zähler auf 1 fallen.

stat DATEI gibt auch die Links aus.

Welches Dateisystem verwendest du?

/ Nachtrag: Gerade gelesen, das du das im Dateimanager löschst. Dann landet die Datei ja im Papierkorb /partitionseinbindepunkt/.Trash-$UID. Dann ist die Datei noch da und der Zähler ändert sich nicht. Also Papierkorb leeren oder gleich „richtig“ löschen.

weholei

(Themenstarter)

Anmeldungsdatum:
7. Februar 2019

Beiträge: 311

Danke, das könnte die Erklärung sein

Werde ich gleich heute Abend probieren

stat DATEI gibt auch die Links aus.

Das müsste ich dann aber mit jeder Datei machen, oder?

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

Ja, müsstest du mit jeder Datei machen. Geht ja nur um eine mögliche Fehlersuche. Leider funktioniert das mit den Inodes in Einbahnstraßenrichtung. Du kannst also ohne Umstände einen Hardlink setzen, aber es gibt keine Tabelle, in der man schnell(!) nachgucken kann, welche Dateien alle auf die selben Inodes zeigen. Ich nutze dann immer find -samefile, mag aber schnellere Wege geben. Da ich für gewöhnlich weiß, welche Dateien ich wie verlinke reicht das für meine Ansprüche.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

ChickenLipsRfun2eat schrieb:

[…] stat DATEI gibt auch die Links aus.

Allerdings (jedenfalls bei mir) nur deren Anzahl und nicht die weiteren Dateinamen. Oder gibt es dafür eine zauberhafte Option?

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

Nein. Wie oben geschrieben → Einbahnstraße. Zumindest kenne ich keinen Weg wie man hardlinks einfach verfolgen kann ohne durch alle Verzeichnisse zu loopen.

weholei

(Themenstarter)

Anmeldungsdatum:
7. Februar 2019

Beiträge: 311

Danke ChickenLipsRfun2eat für das gute Beispiel

-rwxr-xr-x  3 werner werner 5046070 Mär 24 10:24 "america - Das letzte Einhorn - Man's Road.1.dup.mp3"

Wieder was gelernt

die Zahl nach rwx zeigt die Anzahl der Datein, die miteinander verlinkt sind, hier im Beispiel 3, solange sie sich auf der gleichen Partition befinden.

find . -samefile original

findet aber nur die Hardlinks im gleichen Verzeichnis, richtig?

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

weholei schrieb:

die Zahl nach rwx zeigt die Anzahl der Datein, die miteinander verlinkt sind, hier im Beispiel 3, solange sie sich auf der gleichen Partition befinden.

Hardlinks befinden sich immer auf der selben Partition, sonst verweigert ln den Dienst und du musst Softlinks nehmen.

find . -samefile original

findet aber nur die Hardlinks im gleichen Verzeichnis, richtig?

Klar ⇨ find. Der '.' bedeutet 'aktuelles Verzeichnis'. Wenn du auf der ganzen Partition suchen willst, musst du diese angeben. Hast du viele mount --binds oder viele separate Partitionen, lohnt es sich die separat einzubinden um nicht den eingebundenen Links auch noch zu folgen die eh keine Hardlinks unterhalten können.

dirkolus

Anmeldungsdatum:
17. Mai 2011

Beiträge: 1887

ChickenLipsRfun2eat schrieb:

Nein. Wie oben geschrieben → Einbahnstraße. Zumindest kenne ich keinen Weg wie man hardlinks einfach verfolgen kann ohne durch alle Verzeichnisse zu loopen.

Mit ls -li erhält man die Inode-Nummern, danach sollte man auch suchen können (find -inum).

Dateien mit mehreren Hardlinks haben dieselbe Inode nummer.

Dirk

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 611

Hmm, ich würde das per find wie folgt lösen:

$ find ./ -type f -printf "%i\t%n\t%p\n" | grep -v $'\t'1$'\t' | tee $$ | 
cut -d$'\t' -f1 | sort | uniq -c | while read n f; do echo "--- $n ---";grep "^$f" $$; done
$ rm $$

weholei

(Themenstarter)

Anmeldungsdatum:
7. Februar 2019

Beiträge: 311

Hmm, ich würde das per find wie folgt lösen:

Interessant, für mich zwar nur bedingt geeignet, weil, wenn ich den Buchstabensalat abtippe, mache ich mindestens 3 Fehler 😉

Aber verrätst Du mir was es aussagt?

werner@ubu-20-home:/tmp/hardlinktest$ find ./ -type f -printf "%i\t%n\t%p\n" | grep -v $'\t'1$'\t' | tee $$ | 
cut -d$'\t' -f1 | sort | uniq -c | while read n f; do echo "--- $n ---";grep "^$f" $$; done
--- 2 ---
676168	4	./hardlink2
676168	4	./original
werner@ubu-20-home:/tmp/hardlinktest$ 

ich kann nur daraus ersehen, dass es die Datei jetzt 4 mal gibt

./. edit

wer lesen kann.....

Dateien mit mehreren Hardlinks haben dieselbe Inode nummer.

bräuchte nicht dumm fragen

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 611

Aber verrätst Du mir was es aussagt?

Oops, da war ich wohl zu schnell. Daher hier eine kurze Erläuterung:

  • Mit dem "find" Befehl wird ab dem Verzeichnis "./" nach normalen Dateien (-type f) gesucht.

  • Für jede "gefundene" Datei wird durch Tabulator (\t) getrennt ausgegeben:

    • Der "inode" der Datei (%i)

    • Die Anzahl der Hard-Links (%n)

    • Der Dateiname (%p) inclusive dem Verzeichnis ab dem Suchpunkt (./)

  • Mit dem "grep" Befehl werden alle Zeilen ignoriert, die eine hinsichtlich inode unitäre Datei auflistet. Hier ist die Anzahl der Hard-Links gleich 1. Daher die Suche nach "TAB 1 TAB" mit der Negation "-v". Das TAB Zeichen wird hier über das $'\t' Konstrukt eingegeben.

  • Die so gefundenen Datensätze (Dateien mit mehreren Hard-Links) werden in der Datei "$$" über den "tee" Befehl gespeichert, da hierauf später noch zugegriffen werden soll. "$$" beschreibt die eigene PID und ist somit erst mal in diesem Kontext eindeutig.

  • Die in der "$$" Datei gespeicherten Datensätze werden per pipe (|) an den "cut" Befehl weitergegeben, der den Datensatz in durch TAB (-d$'\t') getrennte Felder interpretiert und nur das erste Feld (-f1 = inode) weiter gibt.

  • Die so gelieferten inodes werden mit dem Befehl "sort" aufsteigend sortiert.

  • Mit dem Befehl "uniq" werden sortierte Datensätze hinsichtlich Eindeutigkeit betrachtet und gleiche Werte gezählt (-c).

  • Die Ausgabe von Anzahl gleicher inodes sowie die inode-Nummer werden durch die "while ... ; do ... done" Schleife weiter verarbeitet. Hier bei werden die beiden durch space getrennten Werte n (Anzahl) und f (inode-Nummer) durch den "read" Befehl gelesen.

  • Statt der Aktion, die du nun ausführen möchtest, habe ich die die Anzahl der Hard-Links ausgegeben (echo ... $n) und suche in der "$$" Datei nach den inodes, die mit der inode-nummer ($f) beginnen (^). Um sauber zu sein, sollte man aber wohl besser ein grep "^$f$'\t'" $$ machen.

In deinem Fall hat die Datei "./hardlink2" offenbar 4 Hard-Links. Es sind unterhalb von "./" aber nur 2 gefunden worden.

Antworten |