Brauche Shell script Hilfe - Dateinamen auslesen und sequenzen im string speichern

T

treki

Grünschnabel
Hallo Liebe Shell Experten!
Ich sitze vor einer Aufgabe die ich alleine leider nicht lösen kann (so weit bin ich noch nicht mit shell) :(

Ich möchte ein Shell script erstellen, das in einen bestimmten Ordner die filenamen prüft und mir einen string mit den sequenzen (von-bis) erstellt.
;) Ist schwer zu erklären, daher versuche ich es so:

Ich habe einen Ordner in den mehrere dpx (Bilddateie) liegen z.B.:
333.0000005.dpx
333.0000006.dpx
333.0005002.dpx
333.0005003.dpx
333.1112201.dpx
333.1112202.dpx
333.1112203.dpx

jetzt möchte ich, das das shell script diesen Ordner (z.B.333) durchsucht und mir am ende folgenden String ausgibt:
0000005-0000006,0005002-0005003,1112201-1112203

also immer "von-bis","von-bis",...

habt Ihr vielleicht eine Lösung für mich?
Ich wäre euch unendlich dankbar, da dies meinen Arbeitsaufwand unglaublich verringern würde.


Schönen Gruß
Mike
 
cd $ordner;
#1: sed -n '2,${s/^.*333.//;p}' <(ls -l) | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s ", $(x), $(x+1); } printf "\n"} '

#2: sed -n '2,${s/^.*333.//;p}' <(ls -l) | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s, ", $(x), $(x+1); } printf "\n"} ' | sed 's/,\s$//'

Nicht elegant aber das geht.
Kannste dann einfach in ne Schleife packen um über mehrer Folder zu iterieren.
 
Zuletzt bearbeitet:
Hi smg
habe deinen tip ausprobiert jedoch spcukt mir die shell immer folgenden fehler aus:

line 2: syntax error near unexpected token `('
line 2: `sed -n '2,${s/^.*101.//;p}' <(ls -l) | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s ", $(x), $(x+1); } printf "\n"} ''

Mein script sieht so aus:

cd /101/source/101/;

sed -n '2,${s/^.*101.//;p}' <(ls -l) | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s ", $(x), $(x+1); } printf "\n"} '

sed -n '2,${s/^.*101.//;p}' <(ls -l) | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s, ", $(x), $(x+1); } printf "\n"} ' | sed 's/,\s$//'

kann es daran liegen das ich unter OSX arbeite?
 
Code:
for (x=1; x<NF; x=x+2)
Ich würd sagen, da fehlt ne Klammer:
Code:
for ((x=1; x<NF; x=x+2))
 
Hallo

Code:
sed -n '2,${s/^.*101.//;p}' <(ls -l)

Geht nicht!
Code:
ls -l|sed ....

Gruß Wolfgang
 
Hallo

Code:
sed -n '2,${s/^.*101.//;p}' <(ls -l)

Geht nicht!
Code:
ls -l|sed ....

Gruß Wolfgang


Bei mir geht beides! Keine Ahnung warum bei euch nicht.

Deshalb probiere das hier:
ls -l | sed -n '2,${s/^.*333.//;p}' | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s, ", $(x), $(x+1); } printf "\n"} ' | sed 's/,\s$//'

Code:
stephan@unimatrix ~ $ bash -version
GNU bash, version 3.2.15(1)-release (i686-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Code:
for (x=1; x<NF; x=x+2)
Ich würd sagen, da fehlt ne Klammer:
Code:
for ((x=1; x<NF; x=x+2))

Das ist auch falsch, ich verwende awk und keine Shell for Schleife!!
 
So habe jetzt folgendes eingegeben :

cd /101/source/101/

ls -l | sed -n '2,${s/^.*101.//;p}' | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s ", $(x), $(x+1); } printf "\n"} '


leider spuckt er mir jetzt eine andere fehlermeldung aus :(

sed: 1: "2,${s/^.*101.//;p}": extra characters at the end of p command

Was kann das jetzt sein?
 
"2,${s/^.*101.//;p}": <-- wieso nimmst du " " und nicht die ' '?

ls -l | sed -n '2,${s/^.*101.//;p}' | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s, ", $(x), $(x+1); } printf "\n"} ' | sed 's/,\s$//'
 
Hab ich doch gar nicht :)
Ich glaube die Terminal-fehlerausgabe legt das nur in"" um den fehlerbereich zu makieren.

ich habe es eingefügt wie du beschrieben hast!
ls -l | sed -n '2,${s/^.*101.//;p}' | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s ", $(x), $(x+1); } printf "\n"} '

Trotzdem hat er da ein problem

:hilfe2:
 
Ich hoffe ich hab das jetzt richtig herausgefunden:
habe über Help folgende infos bekommen:

NU bash, version 2.05b.0(1)-release (powerpc-apple-darwin8.0)

nur ich weiß nicht wie ich mir die Sed version anzeigen lassen kann (man sed sagt mir nichts zur version:(
 
Code:
stephan@unimatrix ~ $ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

Code:
stephan@unimatrix ~ $ bash --version
GNU bash, version 3.2.15(1)-release (i686-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
 
GNU bash, version 2.05b.0(1)-release (powerpc-apple-darwin8.0)
Copyright (C) 2002 Free Software Foundation, Inc.

Sed kennt bei OSX leider den befehl --version nicht :( habe ich jetzt in diversen foren gelesen ...


kann es sein das das script deshalb nicht funktioniert ?
kann ich die sed updaten?
 
Ja klar kannst du Sed updaten, weil bei mir rennt es problemlos durch. Sed wird ja immer benötigt, ein Update wäre sicher nicht schlecht und von Bash auch gleich.

Mach mal das:

ls -l | sed -n '2,$p' | sed 's/^.*333\.//' | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s - %s, ", $(x), $(x+1); } printf "\n"} ' | sed 's/,\s$//'
 
Zuletzt bearbeitet:
Hallo,

da ich hier auch ein OSX zur Verfügung habe, habe ich mal versucht die Sache
ein bißchen weiter voran zu treiben :)

@treki: Also, dass Leute bei der Threaderstellung OS, Bash, sed und andere Versionen
nicht angeben, die ein Linux haben ist irgendwo noch nachzuvollziehen. MacOSX ist
schon wieder so exotisch, wenn auch Unix-based, dass man es unbedingt mit angeben muss!

Zu Deiner Frage, ob man sed oder bash updaten soll:
Unter Mac OS X ist das so eine Sache, mir ist es schon desöfteren passiert, dass nach einem
Systemupdate wieder alles auf Standard war oder z.B. nach dem Rechte reparieren
mit dem Festplattendienstprogramm, der Kompilierungsaufwand ist es fast nicht Wert.

Zur sed-Version unter Mac OS X (Version 10.4.9) - die Versionsnummer kann ich ebenfalls
nicht übers System herausfinden, blöd, alles was ich finde ist ein Datum in der Man-Page:
Code:
schlaubi:/101/source/101 schlaubi$ system_profiler | grep -E "System Version|Kernel Version"
      System Version: Mac OS X 10.4.9 (8P2137)
      Kernel Version: Darwin 8.9.1

schlaubi:/101/source/101 schlaubi$ hostinfo | grep Darwin
         Darwin Kernel Version 8.9.1: Thu Feb 22 20:55:00 PST 2007; root:xnu-792.18.15~1/RELEASE_I386

schlaubi:/101/source/101 schlaubi$ info sed
man sed|info sed schrieb:
...
HISTORY
A sed command, written by L. E. McMahon, appeared in Version 7 AT&T UNIX.

AUTHORS
Diomidis D. Spinellis <dds@FreeBSD.org>

BSD July 17, 2004 BSD


Nun zum Laufen habe ich es schon gebracht, allerdings gibt es in diesem Code
noch ein "logisches Problem", hier erstmal der unter OSX getestete Code:

Code:
schlaubi:/101/source/101 schlaubi$ ls -l 
total 0
-rw-r--r--   1 schlaubi  admin  0  3 Jun 14:06 333.0000005.dpx
-rw-r--r--   1 schlaubi  admin  0  3 Jun 14:06 333.0000006.dpx
-rw-r--r--   1 schlaubi  admin  0  3 Jun 14:06 333.0005002.dpx
-rw-r--r--   1 schlaubi  admin  0  3 Jun 14:06 333.0005003.dpx
-rw-r--r--   1 schlaubi  admin  0  3 Jun 14:06 333.1112201.dpx
-rw-r--r--   1 schlaubi  admin  0  3 Jun 14:06 333.1112202.dpx
-rw-r--r--   1 schlaubi  admin  0  3 Jun 14:06 333.1112203.dpx

schlaubi:/101/source/101 schlaubi$ ls |  sed 's/\(^.*333\.\)\(.*\)\(\.dpx\)$/\2/' | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s-%s, ", $(x), $(x+1); } printf "\n"} ' | sed 's/\(.*\)\(, \)$/\1/'
0000005-0000006, 0005002-0005003, 1112201-1112202
schlaubi:/101/source/101 schlaubi$ ls |  sed 's/\(^.*333\.\)\(.*\)\(\.dpx\)$/\2/' | awk -F "\n" 'BEGIN { RS="" } { for (x=1; x<NF; x=x+2) { printf "%s-%s,", $(x), $(x+1); } printf "\n"} ' | sed 's/\(.*\)\(,\)$/\1/'
0000005-0000006,0005002-0005003,1112201-1112202

Und nun zum logischen Problem - der Code macht nicht ganz das, was Du möchtest *g

Ich habe einen Ordner in den mehrere dpx (Bilddateie) liegen z.B.:
333.0000005.dpx
333.0000006.dpx
333.0005002.dpx
333.0005003.dpx
333.1112201.dpx
333.1112202.dpx
333.1112203.dpx

jetzt möchte ich, das das shell script diesen Ordner (z.B.333) durchsucht und mir am ende folgenden String ausgibt:
0000005-0000006,0005002-0005003,1112201-1112203

Du möchtest:
0000005-0000006,0005002-0005003,1112201-1112203

der Code macht:
0000005-0000006,0005002-0005003,1112201-1112202
 
Ach ups! :P
Ich dachte er will immer n - n+1, schade eigentlich, dann ist der Code Mist.
Na ja bastelt bissel rum, ihr kriegt das hin! :)
 
Hi :)
also beide scripte funktionieren jetzt geben mir aber leider immer nur sequenzen mit 2 dateien aus (also 2-3,4-5,5-6) ich habe aber leider sequenzen die so aussehen sollten (333223-344435) also viel mehr dateien haben :(

Gibt es dafür denn auch eine lösung ?
 
Bestimmt, sobald ich Zeit habe baue ich dir eine! (Wenn es dann nicht schon jemand anders getan hat!)
 
das wäre echt super da ich hier langsam echt am verzweifeln bin :(
 

Ähnliche Themen

Probleme mit Shell-Script (Listen, Strings, etc.)

Zurück
Oben