find befehl standard sortierreihenfolge

30

Was ist die Standardsortierreihenfolge für Einträge, die vom Befehl linux find zurückgegeben werden?

Zum Beispiel, wenn ich ausstelle

find . -type f -name '*mp3' 

und die Ausgabe besteht aus mehreren Dateien in mehreren Unterordnern. In welcher Reihenfolge werden die Verzeichnisse standardmäßig aufgelistet? Wie ist gleichzeitig die Sortierreihenfolge, in der die Dateien in einem einzelnen Verzeichnis aufgelistet sind?

Manchmal kommt es zurück:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

Sehen Sie, wie zuerst der Inhalt von Verzeichnis B und dann der von Verzeichnis A aufgelistet wird. Gleichzeitig werden Dateien in Verzeichnis A in einer lustigen Reihenfolge aufgelistet.

Nasko
quelle
Aus Erfahrung scheint es pro Installation konsistent zu sein, dh. Wenn Sie auf zwei Computern den gleichen Satz von Dateien haben, wird immer eine Bestellung auf einem Computer und eine völlig andere auf dem anderen zurückgegeben. Ich habe mich schon gefragt, warum +1
James L
1
Ich habe einen FM-Sender in meinem Auto und er spielt immer Songs von meiner Flash-Karte in seltsamer Reihenfolge ab. Ich habe es nie gedacht, aber ich habe erkannt, dass es genau die gleiche Reihenfolge war, in der der obige Befehl seine Ausgabe zurückgab
Nasko
Übrigens: BSD find hat -sParameter zum alphabetischen Sortieren der Ausgabe.
Lapo

Antworten:

19

findwird den Verzeichnisbaum in der Reihenfolge durchlaufen, in der die Einträge in den Verzeichniseinträgen gespeichert sind. Dies ist (meistens) von Lauf zu Lauf auf demselben Computer konsistent und entspricht im Wesentlichen der "Datei- / Verzeichniserstellungsreihenfolge", wenn keine Löschungen vorgenommen wurden.

Einige Dateisysteme ordnen die Verzeichniseinträge jedoch im Rahmen von Komprimierungsvorgängen oder wenn die Größe des Eintrags erweitert werden muss, neu an, sodass die Wahrscheinlichkeit gering ist, dass sich die "unformatierte" Reihenfolge mit der Zeit ändert. Wenn Sie eine konsistente Reihenfolge wünschen, führen Sie die Ausgabe einer zusätzlichen Sortierstufe zu.

Vatine
quelle
Danke für deine ausführliche Antwort! Wenn mein FM-Sender (siehe vorherigen Kommentar) die Titel in der Reihenfolge wiedergibt, in der sie mit dem Befehl find aufgelistet werden, kann ich nicht steuern, in welcher Reihenfolge sie wiedergegeben werden sollen.
Nasko
Nun, die Flash-Karte verwendet wahrscheinlich ein FAT-Dateisystem und wenn ich mich recht erinnere, ist es mit einem Dateisystem-Debugger ziemlich einfach, die Reihenfolge der FAT-Einträge zu ändern. Möglicherweise lohnt es sich, die Titel aus dem aktuellen Flash in der gewünschten Reihenfolge auf einen neuen Flash zu kopieren. Dies ist möglicherweise einfacher.
Vatine
Eine der nützlichen Anwendungen für eine solche Konsistenz ist die Fortschrittsabschätzung von langsam find /path/ -exec ...und viel schneller find /path/, um zuerst eine sortierte Liste von Dateien zu erhalten.
Andrey
6

Sie sollten sich nicht auf eine bestimmte Ausgabereihenfolge von verlassen findund stattdessen sortandere Mittel verwenden, um die Reihenfolge spezifisch zu steuern.

Bis auf weiteres angehalten.
quelle
2

Ich arbeite seit 1984/1991 unter UNIX / Linux und der erste Befehl, der mir beigebracht wurde, war find. Linux / GNU hat so ziemlich alles, was Sie brauchen, in den aktuellen Befehl find eingefügt. Spielen Sie also damit herum.

Hier finden Sie einige hilfreiche Tipps zum Sortieren der Suchausgabe. Die Option -printf bietet zahlreiche Optionen, um eine komplexere Sortierung und Präsentation von Dateiinformationen zu ermöglichen. Es ist das Beste für solche Probleme. Spielen Sie damit, um zu sehen, was für Sie funktionieren wird. Mit -printf können Sie die Ergebnisse nach Ihren Wünschen anpassen und eingrenzen. Dies ist sehr hilfreich, wenn Sie die Ergebnisse nachbearbeiten müssen. Ich hoffe das hilft jemandem.

  1. Wenn Sie -ls verwenden und nach dem Dateinamen sortieren möchten, ist das 11. Feld der Dateiname, sodass Sie Folgendes tun können. Die Option sort -k kann auch mehrere Felder zum Sortieren enthalten.

    find / path -ls | sort -k11

  2. Wenn Sie eine genauere Sortierung der Körnung nach Datum / Uhrzeit in aufsteigender oder absteigender Reihenfolge wünschen, verwenden Sie die Option -printf "". Weitere Informationen finden Sie im Handbuch. Das folgende Beispiel wird in Bruchteilen von Sekunden gedruckt und ist daher sehr genau.

BEISPIEL DATUM / ZEIT: 2016-09-17 + 12: 09: 57.9013929800

find /path -printf "%T+ %p\n" | sort -n # Ascending

find /path -printf "%T+ %p\n" | sort -nr # Descending

Eine andere Möglichkeit, dies ohne Zeichen in der Datums- / Uhrzeitzeichenfolge zu tun, ist.

BEISPIEL DATUM / ZEIT: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
David Conger-Eldeen
quelle