[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Dateinamen kürzen



Robert Michel schrieb:
Salve Dejan!

Hast Du keine Lösungsidee, keinen eignen Ansatz?




On Thu, 29 Jun 2006, Dejan Milosavljevic wrote:

  
Hallo zusammen,

kann jemand einem der Kunst des Skript-Schreibens nicht sooo kundigen 
einen Tip geben, 
    
http://www.tldp.org/LDP/abs/html/  

  
*.tar.gz.done
    
->
  
*.tar.gz übrigbleiben.
Any idea?
    
for i in $(ls *.done); do mv $i $(echo $i| sed s/.done$//); done

(Diese Lösung gilt für die Bash, inwieweit dies Lösung bei
anderen Shells laufen weiß ich nicht.)

Wie kommt man auf soetwas?
1. alle Dateinamen ausgeben, die mit *.done enden:
   ls *.done
2. man möchte diese Liste verarbeiten, man könnte es in eine Datei
   schreiben, oder halt mit einer Subshell $( Befehl| Befehl2) 
   abarbeiten und ausgeben lassen.
3. ein Schleife kann man mit Parameter aus einer Datei, oder halt
   aus eine Subshell füttern
   for i in Dateiname; do befehl1| befehl2....; done
   innerhalb kann man die Variable $i benutzen


Also 1. liefert z.B.
done.1.done
done.2.done
done.3.done

for i in (ls *.done)

erzeugt 3 Schleifendurchgänge, wobei bei der ersten
$i = done.1.done ist
beim zweiten
$i = done.2.done
usw....

jetzt will man die Files umbennen, das geht mit mv
mv $i $VerkürzterDateiname

Wie kann man den Dateinamen kürzen? Sed!

echo done.1.done | sed s/done//
würde .1. liefern - es könne ein done im Dateinamen stecken.
Will man nur das .done am ende löschen, so braucht man die
Regular _expression_ $ die das Zeilenende markiert.
".done$" ist also ein Muster, welches nur am Ende vorkommt,
diese Muster kann man durch // also nichts ersetzten:

Statt direkt mv die Dateinamen zu ändern und sich mit einem
Denkfehler einzuhandeln ersteinmal ohne mv laufen lassen:
ls *.done
-> Ok ich habe alle Dateien die ich verändern will

for i in $(ls *.done); do echo $i| sed s/.done$//; done
-> Ok, die veränderung ist für alle korrekt

for i in $(ls *.done); do mv $i $(echo $i| sed s/.done$//); done


Skripten lernt man in dem man damit rumspielt und von einfacheren
Lösungen Schrittweise ins komplexerer geht. Hat man eine relativ
komplexe Aufgabe, so teilt man sie in kleine Probleme, bei der
man teilweise die Lösungen schon kennt, oder weis wie es geht
- Schritt für schritt wird man mit dem Skripten vertrauter.
Bevor man eine Mailingliste fragt, sollte man zumindest eine
Weile über eingene Lösungsmöglichkeiten nachdenken und dann
sein Wissen ergänzen lassen.

Und ich würde nicht sagen, das ich viel kann.....
also viel Spaß beim Lernen,

rob






   



  
Hallo Michel,

ich habe hier einen halben Tag lang mit awk rumprobiert, aber kam auf keine grünen Zweig.
Stell Dir vor: Ich habs nicht hinbekommen!

Gruß
Dejan

Reply to: