[gelöst] In welcher Reihenfolge findet find dateien?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

[gelöst] In welcher Reihenfolge findet find dateien?

Beitrag von reox » 12.06.2019 10:16:17

Ich habe einen Ordner mit unterordnern von 00 bis FF (also 0-255 in Hex, immer trailing zero).
In jedem dieser Unterordner sind wiederrum Ordner von 00 bis FF und darin liegen dateien benannt mit dem SHA256 der Datei selber.
Dateisystem ist ext4 gemounted als rw,relatime,data=ordered; falls das einen einfluss hat.
Nun rufe ich ein

Code: Alles auswählen

find /der/ordner -type f -exec file {} \;
auf. Ich hätte erwartet, dass ich zuerst die dateien unter /der/ordner/00 sehe, dann alle unter /der/ordner/01 usw.
Allerdings ist die Reihenfolge willkürlich, lediglich wird immer ein Blatt-Ordner komplett ausgegeben, bevor es zum nächsten geht.

Nun macht mir diese Reihenfolge ein wenig das Leben schwer, weil ich nicht weiß wo im Verzeichnisbaum ich mich gerade befinde - der find befehl rennt einige Zeit, da es sich um einige hundert tausend Dateien handelt.
Ist irgendwo dokumentiert welche Reihenfolge find verwendet und ob man dies ändern kann? Ich habe in der manpage nicht unbedingt etwas sinnvolles gefunden.
Müsste ich ein weiteres find vorne dran hängen um die jeweiligen Ordner zu finden, zu sortieren und dann an find zu übergeben?
Zuletzt geändert von reox am 12.06.2019 10:47:14, insgesamt 2-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: In welcher Reihenfolge findet find dateien?

Beitrag von Meillo » 12.06.2019 10:24:16

Die Reihenfolge ist willkuerlich, wie du schon herausgefunden hast. So ist das immer wenn man die Eintraege eines Verzeichnisses liest. Programme wie ls(1) sortieren sie nur jedes Mal. AFAIK kann find(1) sowas nicht.

Wenn du keine ``komischen Zeichen'' in deinen Dateinamen hast, koenntest du das Problem mittels ``find | sort | xargs'' loesen.
Use ed once in a while!

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: In welcher Reihenfolge findet find dateien?

Beitrag von reox » 12.06.2019 10:29:51

Ok gut zu wissen. Jetzt schau ich mir das aber mal mit strace an, was da eigentlich gemacht wird ;)

Alle dateinamen sind "well behaved", also nur zeichen [a-f0-9].
Ein find vorher ausführen ist vermutlich nicht so super, da dann allein das sortieren extrem lange dauert.
Das hier sollte aber gehen:

Code: Alles auswählen

find /der/ordner -mindepth 2 -maxdepth 2 -type d | sort | xargs -I{} find {} -type f
edit: ah ok, es wird offenbar readdir aufgerufen (der syscall ist getdents, der auf readdir verweißt), dessen manpage sagt:
The order in which filenames are read by successive calls to readdir() depends on the filesystem implementation; it is unlikely that the names will be sorted in any fashion.
Offenbar gibt ReiserFS immer in alphabetischer reihenfolge die dateien aus, ext4 offenbar nicht. Wäre interessant zu wissen wie das da genau implementiert ist^^

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: In welcher Reihenfolge findet find dateien?

Beitrag von uname » 12.06.2019 10:36:48

Etwas Offtopic. Scheinbar werden die Dateien bei ext4 nach Inode gefunden und angezeigt:

Code: Alles auswählen

find /der/ordner -type f |xargs stat|grep 'File\|Inode'
Geht das auch irgedenwie mit -exec`?

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: In welcher Reihenfolge findet find dateien?

Beitrag von reox » 12.06.2019 10:39:25

Ich hab auch gerade das hier gefunden: https://lists.openwall.net/linux-ext4/2009/09/16/5

Offenbar wird die Hash order verwendet.
also kann ich nur auf reiser wechseln oder find vorher mit sort kombinieren :D

Aber was mir jetzt auch schonmal hilft ist, dass die Reihenfolge der Order zwar nicht alphabetisch aber immerhin deterministisch sein sollte. dH wenn ich wissen will wie weit er ist, müsste ein

Code: Alles auswählen

find /der/ordner -maxdepth 1 | grep -n <aktueller ornder>
in etwa eine approximation sein.

Antworten