Robert Michel schrieb:
Hallo Michel,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 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 |