Re: Dateinamen kürzen
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
Reply to: