ubuntuusers.de

Dateireihenfolge

Status: Gelöst | Ubuntu-Version: Xubuntu 16.04 (Xenial Xerus)
Antworten |

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Ich bin eben in ein hier dargestelltes Problem gelaufen.

Ich erzeuge 3 Dateien a, b, c aber eine mit Großbuchstaben, nämlich B - zum Filtern hänge ich noch ein .txt dran.

1
for n in a B c; do echo "foo bar $n" > $n.txt; done 

Soweit, so gut. Sind alle da:

1
2
s *.txt
a.txt  B.txt  c.txt

In der Reihenfolge des Erzeugens, oder alphabetisch gereiht unter Vernachlässigung von Groß-Kleinschreibung oder zufällig gereiht. Prüfen wir das kurz nach:

1
2
for n in c B a; do echo "foo bar $n" > $n.txt; done; ls *.txt
a.txt  B.txt  c.txt

Also nicht in Reihenfolge des Erzeugens und auch für zufällig spricht nur noch wenig.

Jetzt habe ich gelernt, dass die Bash die Wildcards interpetiert und an ls schon die fertige Dateiliste übergibt, und so dachte ich, das müsse die gleiche Reihenfolge wie bei sed sein, was spät, aber hoffentlich nicht zu spät, erklärt, wieso ich in die Dateien was reingeschrieben hab.

1
2
3
4
sed 's/bar/cafe/' *.txt 
foo cafe B
foo cafe a
foo cafe c

Andere Reihenfolge. Bemerkenswert, oder?

user_unknown

(Themenstarter)
Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Beim Verfassen des Beitrags kam mir eine Idee, die ich, als ich damit anfing, noch nicht hatte:

Die Shell kann ja ls Dateinamen in einer gewissen Reihenfolge übergeben, aber ls könnte uns trotzdem paternalisieren und nicht einfach tun wie gesagt, sondern darüber hinaus auch sortieren, wahrscheinlich nicht ohne eine Option dieses Sortieren zu steuern bis hin zum Abschalten.

Und ein erster Test (ist natürlich nicht, das fine Manual zu lesen) zeigt:

1
2
ls c.txt a.txt B.txt
a.txt  B.txt  c.txt

Unsere Reihenfolge interessiert ls nicht. Sed dagegen schon:

1
2
3
4
sed 's/bar/cafe/' c.txt a.txt B.txt
foo cafe c
foo cafe a
foo cafe B

Also doch RTFM:

Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

1
2
3
4
ls -f c.txt a.txt B.txt
c.txt  a.txt  B.txt
ls -f *.txt
B.txt  a.txt  c.txt

Wieder was gelernt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

user_unknown schrieb:

Ich bin eben in ein hier dargestelltes Problem gelaufen.

Was genau ist denn das Problem? Geht es darum, dass die Reihenfolge nicht vorhersehbar ist? Oder ist sie einfach nur nicht, wie Du erwartet hast?

Die Shell expandiert übrigens in alphabetischer Reihenfolge:

  • "alphabetically sorted list of filenames matching the pattern" bash

  • "filenames and pathnames, sorted according to the collating sequence in effect in the current locale." POSIX

1
2
for n in c B a; do echo "foo bar $n" > $n.txt; done; ls *.txt
a.txt  B.txt  c.txt

Also nicht in Reihenfolge des Erzeugens und auch für zufällig spricht nur noch wenig.

Jetzt habe ich gelernt, dass die Bash die Wildcards interpetiert und an ls schon die fertige Dateiliste übergibt, und so dachte ich, das müsse die gleiche Reihenfolge wie bei sed sein, was spät, aber hoffentlich nicht zu spät, erklärt, wieso ich in die Dateien was reingeschrieben hab.

1
2
3
4
sed 's/bar/cafe/' *.txt 
foo cafe B
foo cafe a
foo cafe c

Andere Reihenfolge. Bemerkenswert, oder?

Bei mir sind die beiden Reihenfolgen gleich. Und zwar sowohl bei printf '%s\n' *.txt als auch bei ls *.txt und dann natürlich mit sed. Du kannst ls mit "-f" aufrufen um jegliches Sortieren zu unterbinden.

user_unknown

(Themenstarter)
Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

rklm schrieb:

user_unknown schrieb:

Ich bin eben in ein hier dargestelltes Problem gelaufen.

Was genau ist denn das Problem? Geht es darum, dass die Reihenfolge nicht vorhersehbar ist? Oder ist sie einfach nur nicht, wie Du erwartet hast?

Das Problem war, dass ich 7 Dateien bearbeitet habe, nennen wir sie A D H P R S und gesamt. Die gesamt-Datei extra mit Kleinbuchstaben benannt, damit sie nicht zwischen den anderen erscheint, sondern als erste oder letzte, was davon ist eigentlich egal.

Und dann musste ich mit sed aus allen Dateien eine Zeile extrahieren und ging fälschlich davon aus, dass ich die Reihenfolge der Zeilen leicht zuordnen kann, in dem ich ein ls absetze.

Dann bemerkte ich aber zum Glück eine Inkonsistenz und kam drauf, dass meine Annahme, dass ls nicht umsortiert - wieso sollte es das auch tun? - falsch ist.

Die Shell expandiert übrigens in alphabetischer Reihenfolge:

  • "alphabetically sorted list of filenames matching the pattern" bash

Ja, aber ls sortiert dann nach Gutdünken um.

  • "filenames and pathnames, sorted according to the collating sequence in effect in the current locale." POSIX

Gut, nicht nach Gutdünken, sondern nach POSIX-locale:COLLATE. Wird Zeit, dass jmd. mal bei diesem Posix-Consortium vorbeifährt und alles in Schutt und Asche legt. ☺

Was heißt denn alphabetisch? AaBb oder ABab? Muss man erst mühsam recherchieren (rhetorische Frage). ☺

-

Bei mir sind die beiden Reihenfolgen gleich. Und zwar sowohl bei printf '%s\n' *.txt als auch bei ls *.txt und dann natürlich mit sed. Du kannst ls mit "-f" aufrufen um jegliches Sortieren zu unterbinden.

Ja, habe ich schon rausgefunden und im 3. Codeblock vorgeturnt. ☺

Das Problem war nicht, das Problem zu lösen, sondern sich bewusst zu sein, dass es eins gibt. Gelöst sind jetzt beide. Das Formulieren des Problems hat mir dabei geholfen ihm auf den Grund zu gehen - ich hätte die Frage auch, nachdem ich zu 3/4 durch war mit Schreiben, ruhen lassen könnnen, der neuen Idee nachgehen, Problem lösen und Frage gleich wieder löschen können. Aber da man ja selten der einzige ist, der ein Problem hat, dachte ich, ich protokolliere es hier.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

user_unknown schrieb:

rklm schrieb:

Was heißt denn alphabetisch? AaBb oder ABab? Muss man erst mühsam recherchieren (rhetorische Frage). ☺

Deswegen wird ja oft das Schema verwendet, dass man die Reihenfolge durch (meist zwei) führende Zahlen festlegt. Gib mal auf Deinem System ls /etc/*.d ein. ☺

Bei mir sind die beiden Reihenfolgen gleich. Und zwar sowohl bei printf '%s\n' *.txt als auch bei ls *.txt und dann natürlich mit sed. Du kannst ls mit "-f" aufrufen um jegliches Sortieren zu unterbinden.

Ja, habe ich schon rausgefunden und im 3. Codeblock vorgeturnt. ☺

Die Augen, die Augen... 🙄

Aber da man ja selten der einzige ist, der ein Problem hat, dachte ich, ich protokolliere es hier.

Ja, macht ja auch Sinn. Ich war mir nur nicht sicher, ob ich Dich richtig verstanden oder etwas übersehen hatte.

user_unknown

(Themenstarter)
Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

rklm schrieb:

Deswegen wird ja oft das Schema verwendet, dass man die Reihenfolge durch (meist zwei) führende Zahlen festlegt. Gib mal auf Deinem System ls /etc/*.d ein. ☺

Kommt hier nicht in Betracht. Dateinamen werden von einem Programm fix vergeben, andere Programme erwarten genau diese Namen, andere User bekommen die Dateien auch und erwarten diese Namen. Jetzt, da ich weiß, wo der Hund begraben liegt, bin ich auch gefeit - bis ich es in 6 Monaten wieder vergessen habe. ☺

Ja, habe ich schon rausgefunden und im 3. Codeblock vorgeturnt. ☺

Die Augen, die Augen... 🙄

Ich hätte auch dazuschreiben können, dass ich da -f nutze, ist ja leicht zu übersehen.

Antworten |