Bash: Sortierreihenfolge von Dateinamen mit Zahlen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
withorwithoutaname
Beiträge: 30
Registriert: 27.11.2006 11:51:22

Bash: Sortierreihenfolge von Dateinamen mit Zahlen

Beitrag von withorwithoutaname » 07.04.2007 11:28:56

Hallo Leute,

in einem Verzeichnis befinden sich folgende Dateien:

Code: Alles auswählen

lti@varuna:~/archiv/epos/mahabharata$ ls
m10.1_1.e  m1.1_1.e  m13.1_1.e  m15.1_1.e  m17.1_1.e  m2.1_1.e  m4.1_1.e  m6.1_1.e  m8.1_1.e
m11.1_1.e  m12.2.e   m14.1_1.e  m16.1_1.e  m18.1_1.e  m3.1_1.e  m5.1_1.e  m7.1_1.e  m9.1_1.e
lti@varuna:~/archiv/epos/mahabharata$
Wenn ich die "joinen" möchte mit:

Code: Alles auswählen

cat m* > joined.txt
ist diesselbe Sortierregel wirksam (10,11,1,12,13 ... - wie nennt man das?), aber ich möchte gerne "1,2,3 ..." haben.

Wie kann man das machen?

Gruß,
D.S.

Benutzeravatar
Warlord
Beiträge: 128
Registriert: 10.03.2005 12:18:18
Wohnort: Norddeutschland

Beitrag von Warlord » 07.04.2007 14:54:39

Z. B. so

Code: Alles auswählen

cat m[0-9].* m[0-9][0-9].* >joined.txt
Dann nimmt er erst die einstelligen und dann die zweistelligen.

Vielleicht geht in Deinem Fall auch

Code: Alles auswählen

cat m?.* m??.* >joined.txt
Hab's nicht nachgestellt, einfach mal ausprobieren.

withorwithoutaname
Beiträge: 30
Registriert: 27.11.2006 11:51:22

Beitrag von withorwithoutaname » 09.04.2007 21:03:29

Warlord hat geschrieben:Z. B. so

Code: Alles auswählen

cat m[0-9].* m[0-9][0-9].* > joined.txt
Prinzipiell o.k. (muss man nicht versuchen, global zu ändern), in einem anderen Verzeichnis habe ich aber 3- und 4-zahlenstellige
Dateinnamen:
  • 001.pbm, 002 ...
    010, 011 ...
    100, 101 ...
    1000, 1001 ...

Code: Alles auswählen

ls 00[1-9].pbm 0[1-9][1-9].pbm [1-9][1-9][1-9].pbm [1-9][1-9][1-9][1-9].pbm
bringt dann aber 001.pbm bis 999.pbm und die 4-stelligen alle wieder dazwischen.
Man müsste je nach Stellenanzahl führende Nullen ergänzen:
  • 001.pbm -> 0001.pbm
    010 -> 0010
    100 -> 0100 usw.
Weiß jemand eine Lösung (vielleicht mv und sed)?

Methusalix

Bash: Sortierreihenfolge von Dateinamen mit Zahlen

Beitrag von Methusalix » 10.04.2007 01:23:36

Hallo,

ich orientiere mich mal an Deinem Ursprungspost (was die Dateinamen angeht).
Da Du ja sed angesprochen hast:

Code: Alles auswählen

user@debbi:~/test$ ls
m10.1_1.e  m1.1_1.e   m13.1_1.e  m234.4_2.e
m11.1_1.e  m12.1_1.e  m2.1_1.e   m3.1_1.e
und dann mit sed und pipes:

Code: Alles auswählen

user@debbi:~/test$ ls | sed 's/^.//g' | sort -n
1.1_1.e
2.1_1.e
3.1_1.e
10.1_1.e
11.1_1.e
12.1_1.e
13.1_1.e
234.4_2.e
Vielleicht geht das in die von Dir gewünschte Richtung.
Gruß
Matthias

withorwithoutaname
Beiträge: 30
Registriert: 27.11.2006 11:51:22

[gelöst]

Beitrag von withorwithoutaname » 10.04.2007 07:06:17

O.k., es handelte sich um zwei Problemkreise.
Bei den Dateien der Ursprungsnachricht (m1.1_1.e, m10.1_1.e usw) "richtige" Sortierung mit:

Code: Alles auswählen

ls | sed 's/^.//g' | sort -n
Bei den anderen (001.pbm, 010.pbm, 100.pbm, 1000.pbm) habe ich die 3-stelligen per mv mit führenden Nullen ausgestattet:

Code: Alles auswählen

for i in $(ls [0-9][0-9][0-9].pbm); do mv $i 0$i; done
Danke für die guten Tips.

Gruss,
DS

Antworten