Linux Sortierung bei `ls -ll` ?? [Gelöst]
Linux Sortierung bei `ls -ll` ?? [Gelöst]
Wo ist da die Logik? Mittendrin in den Einträgen welce ein `__` enthalten befinden sich die Dateien ohne `__`
Ich meine die Dateien `compile.sh` sowie `pull.sh`.
Gerade Rücksprache gehalten mit einem unserer Senior Engineers, hat einen Uni-Anschluss und findet es auch nicht logisch:
https://i.ibb.co/3v8C7jc/linux-sort-problem.jpg
Ich meine der Rest ist sonst alphabetisch-lexiaklisch in aufsteigender Reihenfolge sortiert. Aber die beiden SAchen nicht ,die gehören meines Erachtens entweder
a.) VOR all die Einträge mit `__`
ODER
b.) NACH all die Einträge mit `__`
Vielen Dank für die Feedbacks.
Ich meine die Dateien `compile.sh` sowie `pull.sh`.
Gerade Rücksprache gehalten mit einem unserer Senior Engineers, hat einen Uni-Anschluss und findet es auch nicht logisch:
https://i.ibb.co/3v8C7jc/linux-sort-problem.jpg
Ich meine der Rest ist sonst alphabetisch-lexiaklisch in aufsteigender Reihenfolge sortiert. Aber die beiden SAchen nicht ,die gehören meines Erachtens entweder
a.) VOR all die Einträge mit `__`
ODER
b.) NACH all die Einträge mit `__`
Vielen Dank für die Feedbacks.
Zuletzt geändert von jmar83 am 11.02.2021 16:09:38, insgesamt 2-mal geändert.
Freundliche Grüsse, Jan
Re: Linux sortierung bei `ls -ll` ??
In manchen Locales werden Sonderzeichen beim Sortieren ignoriert. Vielleicht liegt es daran. (Den Screenshot konnte ich nicht anschauen.)
Use ed once in a while!
Re: Linux sortierung bei `ls -ll` ??
Als ergänzendes Beispiel zu Meillos Erklärung:
Code: Alles auswählen
/tmp/tmp.1L6ThSXoun$ LC_ALL=C ls -1
clone_C_MQTT.sh
clone_PAHO_MQTT.sh
clone__A_MQTT.sh
clone__B_MQTT.sh
Code: Alles auswählen
/tmp/tmp.1L6ThSXoun$ LC_ALL=de_DE.UTF-8 ls -1
clone__A_MQTT.sh
clone__B_MQTT.sh
clone_C_MQTT.sh
clone_PAHO_MQTT.sh
Es ist übrigens nicht unbedingt hilfreich, wenn du in deinem Screenshot ausgerechnet die relevanten Buchstaben in den Dateinamen versteckst …
Zuletzt geändert von JTH am 26.01.2021 13:31:58, insgesamt 1-mal geändert.
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Linux sortierung bei `ls -ll` ??
Danke fürs Feedback.
Hier noch der Screenshot:
Die verdeckten Einträge beginnen mit "clone_" sowie "pull__" enden mit "GLICHER_WERT_[variabel]" und haben überall gleich viele Underlines drin... bei "clone_" eines, bei "pull__" zwei...
Hier noch der Screenshot:
Die verdeckten Einträge beginnen mit "clone_" sowie "pull__" enden mit "GLICHER_WERT_[variabel]" und haben überall gleich viele Underlines drin... bei "clone_" eines, bei "pull__" zwei...
Freundliche Grüsse, Jan
Re: Linux sortierung bei `ls -ll` ??
Nachtrag:
Muss mich korrigieren: Die Sachen mit "clone_XXX" habe ich nur wegen dem Firmennamen zensiert. Bei diesen gibt's aber keine schräge Sortierung, weil ALLES so anfängt.
Das Problem bezieht sich auf die "compile__" sowie "pull__"-Sachen:
Muss mich korrigieren: Die Sachen mit "clone_XXX" habe ich nur wegen dem Firmennamen zensiert. Bei diesen gibt's aber keine schräge Sortierung, weil ALLES so anfängt.
Das Problem bezieht sich auf die "compile__" sowie "pull__"-Sachen:
Freundliche Grüsse, Jan
Re: Linux sortierung bei `ls -ll` ??
Freundliche Grüsse, Jan
Re: Linux sortierung bei `ls -ll` ??
Screenshots finde ich hier wenig hilfreich. Nicht nur, dass ich sie nicht anschauen kann, um das Verhalten zu reproduzieren muss ich sie zudem abtippen. (Und jeder mitlesende Person, die es ausprobieren will, muss sie erneut abtippen. Im anderen Fall wuerdest du das nur genau einmal tun fuer alle. Das ist deutlich effektiver. )
Ich schlage vor, dass du auf deinem System in einem temporaeren Verzeichnis ein paar Dateien anlegst, die das Verhalten in minimalster Weise reproduzieren (so wie JTH das getan hat). Dann kopiere den Terminaltext deiner Versuche. Zum einen macht das unsere Arbeit erheblich leichter, zu anderen erlaubt es dir auch selber nachzuvollziehen und zu verstehen was passiert und wie es sich auswirkt.
Die Frage, woran es liegt, ist schon beantwortet (und von JTH auch exemplarisch demonstriert): An deinem Locale.
Ich schlage vor, dass du auf deinem System in einem temporaeren Verzeichnis ein paar Dateien anlegst, die das Verhalten in minimalster Weise reproduzieren (so wie JTH das getan hat). Dann kopiere den Terminaltext deiner Versuche. Zum einen macht das unsere Arbeit erheblich leichter, zu anderen erlaubt es dir auch selber nachzuvollziehen und zu verstehen was passiert und wie es sich auswirkt.
Die Frage, woran es liegt, ist schon beantwortet (und von JTH auch exemplarisch demonstriert): An deinem Locale.
Use ed once in a while!
Re: Linux sortierung bei `ls -ll` ??
Gesagt (vielen Dank!!), getan:
...die Kernfrage ist nun also, warum `.` MITTENDRIN ist zwischen `__` bei den beiden Dateien `compile.sh` sowie `pull.sh`
Nun, trotz allem, noch mal ein Screenshot:
Code: Alles auswählen
-rwxr-xr-x 1 root root 114 Jan 26 14:09 all.sh
-rwxr-xr-x 1 root root 333 Jan 26 14:09 clean.sh
-rwxr-xr-x 1 root root 331 Jan 26 14:09 clone_PAHO_MQTT_CPP.sh
-rwxr-xr-x 1 root root 359 Jan 26 14:09 clone_PAHO_MQTT_C.sh
-rwxr-xr-x 1 root root 254 Jan 26 14:09 clone_XXX_CPP.sh
-rwxr-xr-x 1 root root 256 Jan 26 14:09 clone_XXX_DB_LOCAL.sh
-rwxr-xr-x 1 root root 259 Jan 26 14:09 clone_XXX_INSTALL.sh
-rwxr-xr-x 1 root root 0 Jan 26 14:09 clone_XXX_WEB_LOCAL.sh
-rwxr-xr-x 1 root root 686 Jan 26 14:09 compile__indiv.sh
-rwxr-xr-x 1 root root 0 Jan 26 14:09 compile__PAHO_MQTT_CCP.sh
-rwxr-xr-x 1 root root 261 Jan 26 14:09 compile__PAHO_MQTT_C.sh
-rwxr-xr-x 1 root root 1864 Jan 26 14:09 compile.sh
-rwxr-xr-x 1 root root 705 Jan 26 14:09 compile__spear.sh
-rwxr-xr-x 1 root root 1316 Jan 26 14:09 compile__xaxadev.sh
-rwxr-xr-x 1 root root 846 Jan 26 14:09 compile__xaxshedler.sh
-rwxr-xr-x 1 root root 803 Jan 26 14:09 compile__XXX_master.sh
-rwxr-xr-x 1 root root 794 Jan 26 14:09 compile__XXX_state.sh
-rwxr-xr-x 1 root root 785 Jan 26 14:09 compile__XXX_sync.sh
-rwxr-xr-x 1 root root 834 Jan 26 14:09 compile__yoctobob.sh
-rwxr-xr-x 1 root root 3101 Jan 26 14:09 createdeb.sh
-rwxr-xr-x 1 root root 15588 Jan 26 14:09 inst.sh
-rwxr-xr-x 1 root root 0 Jan 26 14:09 pull__PAHO_MQTT_CPP.sh
-rwxr-xr-x 1 root root 1076 Jan 26 14:09 pull__PAHO_MQTT_C.sh
-rwxr-xr-x 1 root root 402 Jan 26 14:09 pull.sh
-rwxr-xr-x 1 root root 1060 Jan 26 14:09 pull__XXX_CPP.sh
-rwxr-xr-x 1 root root 651 Jan 26 14:09 pull__XXX_DB_LOCAL.sh
-rwxr-xr-x 1 root root 639 Jan 26 14:09 pull__XXX_INSTALL.sh
-rwxr-xr-x 1 root root 663 Jan 26 14:09 pull__XXX_LOCAL.sh
...die Kernfrage ist nun also, warum `.` MITTENDRIN ist zwischen `__` bei den beiden Dateien `compile.sh` sowie `pull.sh`
Nun, trotz allem, noch mal ein Screenshot:
Freundliche Grüsse, Jan
Re: Linux sortierung bei `ls -ll` ??
Die Antwort darauf ist, dass dein Locale (vermutlich `de_DE.UTF-8') bei der Sortierung alle Sonderzeichen einfach ignoriert. Es wird sortiert wie wenn es sie gar nicht gaebe.jmar83 hat geschrieben:26.01.2021 14:19:42...die Kernfrage ist nun also, warum `.` MITTENDRIN ist zwischen `__` bei den beiden Dateien `compile.sh` sowie `pull.sh`
Code: Alles auswählen
compile__PAHO_MQTT_C.sh
compile.sh
compile__spear.sh
D.h. sortiert wird, wie wenn du die Dateinamen durch `tr -cd A-Za-z0-9' pipen wuerdest.
Wie du vielleicht gemerkt hast, werden Gross- und Kleinbuchstaben einsortiert, also aAbBcC..., ebenso die Umlaute ...oOöÖ... Das ist alles in deinem Locale definiert.
Wie du hier siehst:
Code: Alles auswählen
:-Q printf 'ge\nGe\nga\no\nO\nö\np\n' |LC_COLLATE=de_DE.UTF-8 sort
ga
ge
Ge
o
O
ö
p
:-Q printf 'ge\nGe\nga\no\nO\nö\np\n' |LC_COLLATE=C sort
Ge
O
ga
ge
o
p
ö
Wenn du eine andere Sortierung haben willst, dann musst du die Umgebungsvariable `LC_COLLATE' nach deinen Wuenschen setzen.
Use ed once in a while!
Re: Linux sortierung bei `ls -ll` ??
Nun habe ich auch den zwiten Akademiker (Maschinenbau-Ing. mit Hochschulabschluss) zum Thema gefragt. Nun sind wir uns alle einig, dass die Sache mit dem Punkt entweder
a.) VOR all dem Zeugs mit "__"
oder
b.) NACH all dem Zeugs mit "__"
reingehört.
Ascending mit A-Z / 0-9 oder descending mit Z-A / 9-0 ist klar, also mit Buchstaben oder Zahlen. Wie es um die Regeln bei asc. vs. desc. steht, ist mir zum aktuellen Zeitpunkt nicht bekannt. (Aber mir ist bekannt, dass des z.B. bei Datebanken eine Art "internationale" Kollation gibt, welche bestimmt ob nun è vor é kommt - ist aber ein wenig ein anderes Thema...)
a.) VOR all dem Zeugs mit "__"
oder
b.) NACH all dem Zeugs mit "__"
reingehört.
Ascending mit A-Z / 0-9 oder descending mit Z-A / 9-0 ist klar, also mit Buchstaben oder Zahlen. Wie es um die Regeln bei asc. vs. desc. steht, ist mir zum aktuellen Zeitpunkt nicht bekannt. (Aber mir ist bekannt, dass des z.B. bei Datebanken eine Art "internationale" Kollation gibt, welche bestimmt ob nun è vor é kommt - ist aber ein wenig ein anderes Thema...)
Freundliche Grüsse, Jan
Re: Linux sortierung bei `ls -ll` ??
@ Meillo: Oh, gar nicht gesehen dass zur mit mit Deinen Beitrag dazwischengekommen bist.
Wie könnte man das Problem lösen, dass es "anständig" sortiert? Was müsste ich mit den "Locales" an dieser Stelle tun?
Vielen Dank für Deine kompetente Aussage. Als Entwickler ist mir sowas komplett suspekt. Wenn ich das Zeugs durch nen Quicksort rattern lassen, dann kommt das heraus was zumindest ich persönlich erwarte!" Die Antwort darauf ist, dass dein Locale (vermutlich `de_DE.UTF-8') bei der Sortierung alle Sonderzeichen einfach ignoriert. Es wird sortiert wie wenn es sie gar nicht gaebe."
Wie könnte man das Problem lösen, dass es "anständig" sortiert? Was müsste ich mit den "Locales" an dieser Stelle tun?
Freundliche Grüsse, Jan
Re: Linux sortierung bei `ls -ll` ??
Um Meillo nochmal zu ergänzen
Schau doch einfach mal, Jan, was dir das Werkzeug locale auf dem System sagt.
Aus Interesse habe ich grad mal alle Locales durchprobiert:
Das Ganze braucht locales-all.
Da sieht man z.B. für az_AZ eine unerwartete Sortierung:
Alle Ergebnisse hier: 41249.
Edit: Wobei ich jetzt grad überlege, ob da noch das (unveränderte) Encoding mit reinspielt/beachtet werden müsste? Hmm.
Schau doch einfach mal, Jan, was dir das Werkzeug locale auf dem System sagt.
Aus Interesse habe ich grad mal alle Locales durchprobiert:
Code: Alles auswählen
#!/bin/sh
touch compile.sh compile__spear.sh compile__xaxadev.sh compile__xaxshedler.sh compile__voctobob.sh
while read loc; do
loc="${loc%% *}"
l="$(LC_ALL="$loc" ls -1)"
h="$(echo "$l" | head -n1)"
g="$(echo "$l" | grep -v sort_by_locale)"
if [ "$h" != compile.sh ]; then
printf "### Locale $loc has unexpected sorting:\n$g\n\n"
fi
done < /usr/share/i18n/SUPPORTED
Da sieht man z.B. für az_AZ eine unerwartete Sortierung:
Code: Alles auswählen
### Locale az_AZ has unexpected sorting:
compile__xaxadev.sh
compile__xaxshedler.sh
compile.sh
compile__spear.sh
compile__voctobob.sh
Edit: Wobei ich jetzt grad überlege, ob da noch das (unveränderte) Encoding mit reinspielt/beachtet werden müsste? Hmm.
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Linux sortierung bei `ls -ll` ??
Als ich die Kollation bei Raspbian 9 (das PRoblem hier ist aber Debian) nach `LC_COLLATE=C` umgestellt habe (über `raspi-config`), hatte die SSH-Konsole plötzllich ein Problem mit Umlauten. Dann haben unsere Leute plötzlich angefanen, alles mit "ae", "ue" sowie "oe" zu schreiben - na ja..
Freundliche Grüsse, Jan
Re: Linux sortierung bei `ls -ll` ??
Hmm, schau lieber nicht zu genau rein, ich glaube, meine Schlussfolgerung ist nicht ganz richtig dabei. Als Demo, was die Locale beeinflusst, hilfts vielleicht. Meillos Erklärung triffts allerdings besser.
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Linux sortierung bei `ls -ll` ??
EDIT: Oh, nach den neuen Posts im Thread hat sich mein Post wohl erledigt. Danke, JTH!
Hier dennoch was ich posten wollte:
Welcher Wert fuer dich passt, haengt davon ab, *wie* genau du es sortiert haben willst. Ich weiss leider nicht, wie man herausfinden kann, welches Locale wie sortiert oder ob man ggf. die Sortierung des Locales irgendwie anpassen kann. Weiss da jemand mehr?
Dann musst du dir noch eine Anleitung suchen, wie du Umgebungsvariablen (environment variables) in deiner Desktopumgebung (oder was du verwendest) setzen kannst.
Ich denke, dass andere User hier dir dabei sicher behilflich sein koennen.
Hier dennoch was ich posten wollte:
Leider erwarten unterschiedliche Personen unterschiedliche Dinge.jmar83 hat geschrieben:26.01.2021 14:35:40Als Entwickler ist mir sowas komplett suspekt. Wenn ich das Zeugs durch nen Quicksort rattern lassen, dann kommt das heraus was zumindest ich persönlich erwarte!
Du musst die Umgebungsvariable `LC_COLLATE' setzen.jmar83 hat geschrieben:26.01.2021 14:35:40Wie könnte man das Problem lösen, dass es "anständig" sortiert? Was müsste ich mit den "Locales" an dieser Stelle tun?
Welcher Wert fuer dich passt, haengt davon ab, *wie* genau du es sortiert haben willst. Ich weiss leider nicht, wie man herausfinden kann, welches Locale wie sortiert oder ob man ggf. die Sortierung des Locales irgendwie anpassen kann. Weiss da jemand mehr?
Dann musst du dir noch eine Anleitung suchen, wie du Umgebungsvariablen (environment variables) in deiner Desktopumgebung (oder was du verwendest) setzen kannst.
Ich denke, dass andere User hier dir dabei sicher behilflich sein koennen.
Use ed once in a while!
Re: Linux sortierung bei `ls -ll` ??
Brauche ich monentan nicht. Mag Linux als Server (LAMP etc.) als Desktop bevorzuge ich eher das "Andere""Dann musst du dir noch eine Anleitung suchen, wie du Umgebungsvariablen (environment variables) in deiner Desktopumgebung (oder was du verwendest) setzen kannst."
An euch beide: THX: !!
Freundliche Grüsse, Jan