staging.inyokaproject.org

Hardlinks finden

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

UlfZibis

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

Hallo,

wie kann ich auflisten, ob und wieviele harte Links es zu den Dateien in einem Verzeichnis gibt?

Marc_BlackJack_Rintsch

Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: Zähle...

Die Information ist doch in ls -l enthalten‽ Oder willst Du nach Dateien vs. Verzeichnisse filtern? Dann:

$ find . -maxdepth 1 -type f -printf '%n %p\n' 

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Und wenn Du die Dubletten finden willst, könntest Du das z.B. so machen

1
find . -printf '%i %p\n' | fgrep -f <(find . -printf '%i\n' | sort -n | uniq -cd)

Oder was mit awk.

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

Marc_BlackJack_Rintsch schrieb:

Die Information ist doch in ls -l enthalten‽

Stimmt, danke. Die kleine vorangestellte Zahl habe ich nie beachtet und deren Bedeutung ging mir aus ls --help nicht hervor.

Oder willst Du nach Dateien vs. Verzeichnisse filtern? Nein, aber danke. Auch das würde dann reichen:

$ find . -maxdepth 1 -type f -ls' 

rklm schrieb:

Und wenn Du die Dubletten finden willst, könntest Du das z.B. so machen

1
find . -printf '%i %p\n' | fgrep -f <(find . -printf '%i\n' | sort -n | uniq -cd)

Genau danach wollte ich als zweites auch noch fragen, danke!
Leider tut der Befehl nicht, ich bekomme nichts. Was könnte da die Ursache sein? ls -al liefert:

insgesamt 8532
drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 .
drwxrwxr-x 4 ich ich    4096 Jan 15 16:46 ..
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 157_1306
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 161_1707
-rw-r--r-- 2 ich ich 5193975 Jun 13  2013 IMG_0296.JPG
-rw-r--r-- 2 ich ich 3518754 Jul 17  2013 IMG_0310.JPG

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

UlfZibis schrieb:

Leider tut der Befehl nicht, ich bekomme nichts. Was könnte da die Ursache sein?

Dann liegen die Dubletten vermutlich nicht unterhalb von dem aktuellen Verzeichnis, wo Du suchst. Da musst Du dann mal das Verzeichnis wechseln oder die beiden Punkte durch eine Liste von Verzeichnissen ersetzen.

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

rklm schrieb:

Dann liegen die Dubletten vermutlich nicht unterhalb von dem aktuellen Verzeichnis, wo Du suchst. Da musst Du dann mal das Verzeichnis wechseln oder die beiden Punkte durch eine Liste von Verzeichnissen ersetzen.

Hm, daran kann's eigentlich nicht liegen, denn die Dubletten der beiden JPG-Dateien sind, jeweils eine, in den aufgeführten Ordnern:

$ ls -alR
.:
insgesamt 8532
drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 .
drwxrwxr-x 4 ich ich    4096 Jan 15 16:46 ..
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 157_1306
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 161_1707
-rw-r--r-- 2 ich ich 5193975 Jun 13  2013 IMG_0296.JPG
-rw-r--r-- 2 ich ich 3518754 Jul 17  2013 IMG_0310.JPG

./157_1306:
insgesamt 5084
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 .
drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 ..
-rw-r--r-- 2 ich ich 5193975 Jun 13  2013 IMG_0296.JPG

./161_1707:
insgesamt 3448
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 .
drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 ..
-rw-r--r-- 2 ich ich 3518754 Jul 17  2013 IMG_0310.JPG

Danke für die schnelle Antwort.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

UlfZibis schrieb:

rklm schrieb:

Dann liegen die Dubletten vermutlich nicht unterhalb von dem aktuellen Verzeichnis, wo Du suchst. Da musst Du dann mal das Verzeichnis wechseln oder die beiden Punkte durch eine Liste von Verzeichnissen ersetzen.

Hm, daran kann's eigentlich nicht liegen, denn die Dubletten der beiden JPG-Dateien sind jeweils eine in den aufgeführten Ordnern.

Bist Du sicher, dass es sich tatsächlich um Dateien mit mehreren Verzeichniseinträgen und nicht um Kopien handelt?

$ ls -alR
.:
insgesamt 8532
drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 .
drwxrwxr-x 4 ich ich    4096 Jan 15 16:46 ..
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 157_1306
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 161_1707
-rw-r--r-- 2 ich ich 5193975 Jun 13  2013 IMG_0296.JPG
-rw-r--r-- 2 ich ich 3518754 Jul 17  2013 IMG_0310.JPG

./157_1306:
insgesamt 5084
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 .
drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 ..
-rw-r--r-- 2 ich ich 5193975 Jun 13  2013 IMG_0296.JPG

./161_1707:
insgesamt 3448
drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 .
drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 ..
-rw-r--r-- 2 ich ich 3518754 Jul 17  2013 IMG_0310.JPG

Kannst Du mal die Option "-i" zum ls hinzufügen um die Inode-Nummer auszugeben? So kann man nämlich nur sehen, dass da Dateien mit identischer Größe liegen.

Du könntest auch mal find . -printf '%i\n' | sort -n | uniq -cd ausführen und die Ausgabe anschauen / posten. Dann sieht man nämlich, wie viele Dubletten es gibt.

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

rklm schrieb:

Kannst Du mal die Option "-i" zum ls hinzufügen um die Inode-Nummer auszugeben? So kann man nämlich nur sehen, dass da Dateien mit identischer Größe liegen.

Du könntest auch mal find . -printf '%i\n' | sort -n | uniq -cd ausführen und die Ausgabe anschauen / posten. Dann sieht man nämlich, wie viele Dubletten es gibt.

Beides gemacht:

$ ls -ailR
.:
insgesamt 8532
657182 drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 .
656385 drwxrwxr-x 4 ich ich    4096 Jan 15 16:46 ..
656443 drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 157_1306
657032 drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 161_1707
657030 -rw-r--r-- 2 ich ich 5193975 Jun 13  2013 IMG_0296.JPG
657041 -rw-r--r-- 2 ich ich 3518754 Jul 17  2013 IMG_0310.JPG

./157_1306:
insgesamt 5084
656443 drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 .
657182 drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 ..
657030 -rw-r--r-- 2 ich ich 5193975 Jun 13  2013 IMG_0296.JPG

./161_1707:
insgesamt 3448
657032 drwxrwxr-x 2 ich ich    4096 Jan  4 17:58 .
657182 drwxrwxr-x 4 ich ich    4096 Jan 15 17:38 ..
657041 -rw-r--r-- 2 ich ich 3518754 Jul 17  2013 IMG_0310.JPG
$ find . -printf '%i\n' | sort -n | uniq -cd
      2 657030
      2 657041

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

UlfZibis schrieb:

Beides gemacht:

Sieht gut aus. War mein Fehler, da ist ein "c" zu viel. So sollte es klappern:

1
find . -printf '%i %p\n' | fgrep -f <(find . -printf '%i\n' | sort -n | uniq -d)

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

rklm schrieb:

1
find . -printf '%i %p\n' | fgrep -f <(find . -printf '%i\n' | sort -n | uniq -d)

Jetzt kommt immerhin was ☺

Allerdings kann ich bei ca. 500 Dateien nicht prüfen, ob das Ergebnis auch stimmt, denn alles kommt ziemlich durcheinander, und auch nicht sehen, welche Dubletten/Vielfache zusammengehören:

802777 ./IMG_0893.JPG
696616 ./IMG_0841.JPG
689238 ./IMG_0784.JPG
689239 ./IMG_0782.JPG
689198 ./IMG_0679.JPG
689240 ./IMG_0780.JPG
696621 ./IMG_0842.JPG
682796 ./181_0104/IMG_0565.JPG
689148 ./181_0104/IMG_0561.JPG
689235 ./181_0104/IMG_0562.JPG
689237 ./181_0104/IMG_0564.JPG
689440 ./IMG_0830.JPG
682664 ./IMG_0816.JPG
689238 ./198_0410/IMG_0784.JPG
689239 ./198_0410/IMG_0782.JPG
[.....]

Außerdem steht in uniq --help:

  • d, --repeated nur die doppelten Zeilen ausgeben

Es ist also nicht klar, ob auch Tripletten etc. gefunden werden.

Weiterhin wäre es allgemein auch interessant, auch Dubletten finden zu können, die außerhalb des Startpunkts liegen. Ich wundere mich schon, dass GNU coreutils dafür keine Standard-Funktionalität für bereitstellt.
Um das zumindest erkennen zu können, wäre es doch gut, wenn Dein Befehl auch noch die Anzahl der vorhandenen Links mit ausgeben würde.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

find kann direkt nach Hardlinks (= zusätzlichen Dateinamen) zu einer gegebenen Datei suchen:

find SUCHPFAD -samefile DATEINAME 

Beispielsweise listet Dir

find . -samefile IMG_0296.JPG 

alle Dateinamen der angegebenen Datei unterhalb des aktuellen Verzeichnisses. Du musst natürlich für alle Verzeichnisse ab und unterhalb des Suchpfades das Lese- und das Ausführen-Recht haben und genügend Zeit mitbringen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

UlfZibis schrieb:

Jetzt kommt immerhin was ☺

👍

Allerdings kann ich bei ca. 500 Dateien nicht prüfen, ob das Ergebnis auch stimmt, denn alles kommt ziemlich durcheinander, und auch nicht sehen, welche Dubletten/Vielfache zusammengehören:

Dann hängst Du einfach eine Sortierung an:

1
find . -printf '%i %p\n' | fgrep -f <(find . -printf '%i\n' | sort -n | uniq -d) | sort -n

Außerdem steht in uniq --help:

  • d, --repeated nur die doppelten Zeilen ausgeben

Es ist also nicht klar, ob auch Tripletten etc. gefunden werden.

Ja, werden sie. Kann man auch recht einfach ausprobieren.

Weiterhin wäre es allgemein auch interessant, auch Dubletten finden zu können, die außerhalb des Startpunkts liegen.

Dann wähle einfach den Mountpoint des Dateisystems anstatt "." zum Suchen.

Ich wundere mich schon, dass GNU coreutils dafür keine Standard-Funktionalität für bereitstellt.

Es gibt immerhin so etwas: DupeGuru, fslint

Um das zumindest erkennen zu können, wäre es doch gut, wenn Dein Befehl auch noch die Anzahl der vorhandenen Links mit ausgeben würde.

Dann müsste man das noch weiter aufbohren. Da fehlt mir gerade die Zeit. Du siehst es aber, wenn Du nach Inode-Nummer sortierst, wie oben angegeben, weil dann alle Einträge für einen Inode untereinander stehen.

Marc_BlackJack_Rintsch

Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: Zähle...

@kB: Vor allem müsste dann für jede Datei im Verzeichnisbaum der komplette Verzeichnisbaum durchsucht werden, was wohl nicht wirklich praktikabel ist. Und auch keine Dateien findet die Hardlinks haben, wo die Einträge dazu aber nicht innerhalb des Verzeichnisbaums liegen. UlfZibis möchte das ja nicht für eine Datei haben, sondern gerne eine Übersicht über alle Dateien innerhalb eines Verzeichnisbaums.

@UlfZibis: Du musst doch das Ergebnis nur noch einmal numerisch sortieren, dann siehst Du welche zusammengehören und wie viele da jeweils aufeinander folgen. Mit ein wenig Shell- oder AWK-Code kann man die auch zusammenfassen.

Edit: Oder man jagt das durch GNU datamesh:

$ datamash --no-strict --sort -t ' ' groupby 1 count 2 collapse 2 < test.txt
682664 1 ./IMG_0816.JPG
682796 1 ./181_0104/IMG_0565.JPG
689148 1 ./181_0104/IMG_0561.JPG
689198 1 ./IMG_0679.JPG
689235 1 ./181_0104/IMG_0562.JPG
689237 1 ./181_0104/IMG_0564.JPG
689238 2 ./198_0410/IMG_0784.JPG,./IMG_0784.JPG
689239 2 ./198_0410/IMG_0782.JPG,./IMG_0782.JPG
689240 1 ./IMG_0780.JPG
689440 1 ./IMG_0830.JPG
696616 1 ./IMG_0841.JPG
696621 1 ./IMG_0842.JPG
802777 1 ./IMG_0893.JPG

Wobei ich hier jetzt allerdings davon ausgegangen bin, dass die Dateinamen keine Leerzeichen und keine Kommas enthalten.

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

kB schrieb:

find kann direkt nach Hardlinks (= zusätzlichen Dateinamen) zu einer gegebenen Datei suchen:

find SUCHPFAD -samefile DATEINAME 

Fein, das klappt zumindest für einzelne Dateien. Für einen ganzen Suchbaum wird's dann wohl komplizierter, denn folgendes klappt leider nicht:

find . -samefile "*"  

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

rklm schrieb:

Dann hängst Du einfach eine Sortierung an:

1
find . -printf '%i %p\n' | fgrep -f <(find . -printf '%i\n' | sort -n | uniq -d) | sort -n

Suppi! Genau das isses.

Weiterhin wäre es allgemein auch interessant, auch Dubletten finden zu können, die außerhalb des Startpunkts liegen.

Dann wähle einfach den Mountpoint des Dateisystems anstatt "." zum Suchen.

An sowas hatte ich auch gedacht, doch ist das wohl sicher eine längliche Aktion, ich hoffte auf was flotteres. Außerdem wollte ich ja nicht die Dubletten sämtlicher Dateien im Dateisystem finden, sondern nur die Dateien im betreffenden Suchpfad untersuchen.

Es gibt immerhin so etwas: DupeGuru, fslint

Guck ich mir beizeiten mal an, im Moment habe ich ja eine Lösung ☺

Dann müsste man das noch weiter aufbohren. Da fehlt mir gerade die Zeit. Du siehst es aber, wenn Du nach Inode-Nummer sortierst, wie oben angegeben, weil dann alle Einträge für einen Inode untereinander stehen.

Edit: Dann sehe ich aber nur wieviele im Suchpfad existieren, nicht aber, ob woanders noch Dubletten herumgeistern.
Da ich so langsam den Befehls-String verstehe habe ich was ganz einfaches gefunden, einfach nur ein %n ergänzen (Wenn die Zahl größer als die Anzahl der ausgegebenen Zeilen pro Datei ist, dann gibt es noch anderswo Dubletten):

find . -printf '%i %n %p\n' | fgrep -f <(find . -printf '%i\n' | sort -n | uniq -d) | sort -n 

Eventuell geht es mit find -inum auch noch etwas eleganter, habe aber jetzt nicht die Muße, das auszutüfteln.

Antworten |