Frage Standardsortierreihenfolge des Befehls finden


Wie lautet die Standardsortierreihenfolge für Einträge, die vom Befehl linux find zurückgegeben wurden?

Zum Beispiel, wenn ich ausstelle

find . -type f -name '*mp3' 

Die Ausgabe besteht aus mehreren Dateien in mehreren Unterordnern. In welcher Reihenfolge werden die Verzeichnisse aufgelistet? Welche Sortierungsreihenfolge gibt es, in welcher Reihenfolge Dateien in einem einzelnen Verzeichnis aufgeführt 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 aufgelistet wird, dann das von Verzeichnis A. Gleichzeitig werden Dateien in Verzeichnis A in einer lustigen Reihenfolge aufgelistet.


21
2017-09-16 13:24


Ursprung


Aus Erfahrung scheint es konsistent pro Installation zu sein, d. Wenn Sie die gleichen Dateien auf zwei Maschinen haben, gibt es immer eine Bestellung auf einer Maschine und eine andere auf der anderen zurück. Ich habe mich gefragt, warum vorher, +1 - James L
Ich habe einen FM-Sender in meinem Auto und es spielt immer Songs von meiner Flash-Karte in seltsamer Reihenfolge. Ich habe es nie gedacht, aber ich erkannte, dass es genau die gleiche Reihenfolge war, in der der obige Befehl seine Ausgabe zurückgab - Nasko
BTW: BSD hat gefunden -s Parameter zum alphabetischen Sortieren der Ausgabe. - lapo


Antworten:


find Wird der Verzeichnisbaum in der Reihenfolge durchlaufen, werden Einträge innerhalb der Verzeichniseinträge gespeichert. Dies ist (meistens) konsistent von Lauf zu Lauf, auf dem gleichen Rechner und wird im Wesentlichen "Datei- / Verzeichnis-Erstellungsreihenfolge" sein, wenn keine Löschungen stattgefunden haben.

Einige Dateisysteme ordnen Verzeichniseinträge jedoch als Teil von Komprimierungsvorgängen neu oder wenn die Größe des Eintrags erweitert werden muss, gibt es immer eine geringe Chance, dass sich die "rohe" Reihenfolge im Laufe der Zeit ändert. Wenn Sie eine konsistente Reihenfolge wünschen, geben Sie die Ausgabe über eine zusätzliche Sortierstufe ein.


12
2017-09-16 14:15



Danke für deine ausführliche Antwort! Wenn also mein FM-Sender (siehe meinen vorherigen Kommentar) Titel in der Reihenfolge abspielt, in der der Befehl find sie auflistet, kann ich nicht steuern, in welcher Reihenfolge ich sie abspielen möchte. - Nasko
Nun, die Flash-Karte verwendet wahrscheinlich ein FAT-Dateisystem und wenn ich mich richtig erinnere, ist die Manipulation der Reihenfolge der FAT-Einträge mit einem Dateisystem-Debugger ziemlich einfach. Es lohnt sich möglicherweise, die Songs aus dem aktuellen Blitz auf einen neuen Blitz zu kopieren, und zwar in der Reihenfolge, in der sie abgespielt werden sollen, was vielleicht einfacher ist. - Vatine
Eine der nützlichen Anwendungen einer solchen Konsistenz ist eine Fortschrittsschätzung von langsam find /path/ -exec ... mit viel schneller laufen find /path/ um die Liste der Dateien zuerst zu sortieren. - Andrey


Sie sollten sich nicht auf eine bestimmte Reihenfolge verlassen find und sollte stattdessen verwenden sort und andere Mittel, um die Reihenfolge spezifisch zu steuern.


4
2017-09-16 14:00





Ich arbeite seit 1984/91 in UNIX / Linux und der erste Befehl, den ich gelernt habe, war zu finden. Linux / GNU hat so ziemlich alles, was Sie brauchen, in den aktuellen Suchbefehl eingefügt, also spielen Sie damit herum.

Hier sind einige hilfreiche Tipps zum Sortieren der gefundenen Ausgaben. Die Option -printf bietet Ihnen viele Optionen, um komplexere Sortierungen und Dateiinformationen zu ermöglichen. Es ist das Beste für solche Probleme. Spiele damit, um zu sehen, was für dich funktioniert. Mit -printf können Sie die Ergebnisse so anpassen und abgrenzen, wie Sie möchten. Dies hilft ein wenig, wenn Sie die Ergebnisse nachbearbeiten müssen. Ich hoffe, das hilft jemandem.

  1. Wenn Sie -ls verwenden und nach Dateiname sortieren möchten, ist das 11. Feld der Dateiname, so dass Sie Folgendes tun können. Die Option "sort -k" kann auch mehrere Felder enthalten, nach denen sortiert werden kann.

    Finde / Pfad -ls | Sortieren-k11

  2. Wenn Sie feinere Kornkontrolle wünschen, d. H. Nach Datum / Uhrzeit in aufsteigender oder absteigender Reihenfolge sortieren, verwenden Sie die Option -printf "". Weitere Einzelheiten finden Sie im Handbuch. Im folgenden Beispiel wird jedoch mit Sekundenbruchteilen gedruckt, damit es sehr genau ist.

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 Datum / Uhrzeit-Zeichenfolge zu tun, ist.

BEISPIEL DATUM / ZEIT: 20160917120013.8101685040

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

0
2017-09-17 18:30