Mehrfach-Umbenennung an der shell

Hallo !
ich möchte auf einen Schlag meherer Dateien (bilder umbenennen).

Beispiel:

ich habe 1linkon.jpg, 2linkon.jpg …
die möchte ich nun in 1linkoff.jpg, 2linkoff.jpg umbenennen.

Probiert habe ich es mit „mv *linkon.* *linkoff.*“
bzw. mv *linkon.jpg *linkoff.jpg.

mit cp habe ich eigentlich das gleiche probiert.

Beides tut nicht.

Weiß mir da jemand Rat ???

Viele Grüße und Danke im Voraus

Markus

Hallo Markus,

so eine Aufgabe kannst Du bequem mit einer for-Schleife erledigen. In der tcsh sieht das z.B. so aus: (Du kommst in eine tcsh, indem Du einfach „tcsh“ eintippst.)

Zueerst mal ein Beispiel, wie Du an jeden Namen eine Erweiterung anhängen kannst.

–> foreach f (*.jpg)
foreach? mv $f $f:r_erweiterung.jpg
foreach? end
–>

Was passiert hier? In der ersten Zeile legst Du fest, daß die Vatiable f nacheinander jeden Filenamen annehmen soll, der im aktuellen Verzeichnis steht und die Endung .jpg hat. Im folgenden mv-Befehl greifst Du auf diesen Namen mit dem Ausdruck „$f“ zu. Das ist eine Eigenart der shell, wenn Du eine Variable definierst, gibtst Du Ihr irgendeinen Namen, hier also „f“, wenn Du auf die Variable zugreifst, tust Du das mit dem vorangestellten „$“.

Der Ausdruck $f:r gibt den Filenamen ohne Endung zurück. Du kannst das testen, indem Du einfach anstelle des mv-Befehls einfach
echo $f:r
schreibst.

Angenommen, Deine erste Datei heißt 1linkon.jpg. Dann übersetzt sich die Zeile
mv $f $f:r_erweiterung.jpg
in
mv 1linkon.jpg 1linkon_erweiterung.jpg

Das ist noch nicht genau das, was Du möchtest. Wenn die Dateien wirklich alle gleich heißen, bis auf die unterschiedliche zahl, könntest Du so rangehen:

–> foreach f (*.jpg)
foreach? set d = echo $f | sed s/on/off/
foreach? mv $f $d
foreach? end
–>

Hier gibt es einen kleinen Umweg: der Befehl
echo $f | sed s/on/off/

gibt den Filenamen aus („echo $f“) und gibt das direkt weiter (mit der „pipe“ (|)), an den Befehl „sed“. Dieser ersetzt das „on“ durch „off“. Das ganze wird in der Variablen „d“ gespeichert, die dann in der nächsten Zeile verwendet wird.

Das ganze sieht bestimmt verwirrend aus, aber wenn man es mal erfolgreich probiert hat, gewöhnt man sich schnell dran.

Du kannst mit jedem einzelnen Befehl rumexperimentieren, dann wirds bestimmt schnell klar. Probier z.B. mal

–> echo „hallo wult“ | sed s/u/e/
hallo welt

Ach ja, und vorher bitte ein Backup von den Bildern machen :smile:

Viel Glück,

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo !
ich möchte auf einen Schlag meherer Dateien (bilder
umbenennen).

Probiert habe ich es mit „mv *linkon.* *linkoff.*“
bzw. mv *linkon.jpg *linkoff.jpg.

mit cp habe ich eigentlich das gleiche probiert.

Beides tut nicht.

Hallo Markus,

das kann so nicht gehen, da die Shell versucht, die Globs - sprich die Fileargumente mit ‚Wildcards‘ - zu expandieren. Bei *linkon.* findet sie (wahrscheinlich) deine Originaldateien, bei *linkoff.* wohl nichts, deshalb bleibt der Parameter unangetastet.

Probiers z.B. mal so:

for fname in \*linkon.\*
do
 pre=${fname%linkon.\*}
 post=${fname#${pre}linkon}
 newfname=${pre}linkoff${post}
 mv $fname $newfname
done

Sollte so funktionieren (ungetestet), kann u.U. Probleme machen, wenn der Teilstring ‚linkon‘ mehrfach im Dateinamen vorkommt.

Gruss
bernhard

Ach ja, bash oder ksh sollte es sein… vergessen.

Gruß
bernhard

DANKE !!!
Leute; ihr seit Superklasse !!!
Vielen DANK !!! So super erklärt. Spitze.

Die erste Hilfe mit der bash hat auf Anhieb geklappt.

Der tcsh-Part nur teilweise. Ist aber trotzdem wertvoll für mich, da ich jetzt wenigstens einen praktischen Minieinstig in sed hab (ich mein das Ernst).

Bei der tcsh-Version bekomme ich folgende Fehler:

foreach?: Kein Treffer.
d: Undefinierte Variable.

Vielen Dank

Markus

foreach?: Kein Treffer.
d: Undefinierte Variable.

Um mal alle möglichen Fehler auszuschließen, so müßte ein kleiens Skript aussehen:

#!/bin/tcsh -f

foreach f (*.jpg)
set d = echo $f | sed s/on/off/
mv -v $f $d
end

Wenn Du das in ein file kopierst, und es ausführbar machst, kannst Du es zum Umbenennen der Dateien aufrufen. So sollten Deine Fehlermeldungen eigentlich nicht mehr auftauchen.

Viele Grüße,

Peter

Vielen Dank

Markus

Hallo,

es gibt das nuetzliche Programm rename. Damit loest man das beschriebene Problem mit einem Aufruf von

rename on off ?linkon.\*

mehr infos mit

man rename

Gruss,
Max

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Max,

sehr schön gelöst das Problem, wieder was gelernt :smile:

Grüße,
Peter

Hallo,

es gibt das nuetzliche Programm rename. Damit loest man das
beschriebene Problem mit einem Aufruf von

rename on off ?linkon.*

mehr infos mit

man rename

Gruss,
Max

Bitte!

Der tcsh-Part nur teilweise. Ist aber trotzdem wertvoll für
mich, da ich jetzt wenigstens einen praktischen Minieinstig in
sed hab (ich mein das Ernst).

Bei der tcsh-Version bekomme ich folgende Fehler:

Auch bei den Shells gibts es diverse Glaubenskriege (poste doch mal irgendwo den schoenen Satz ‚vi ist der beste Editor‘, dann wirst du wissen, was ich meine…).

Trotzdem kann ich mir den Hinweis auf einige ‚Eigenheiten‘ der C-Shell nicht verkneifen:

http://www.faqs.org/faqs/unix-faq/shell/csh-whynot

Gruss und viel Spass weiterhin (mit der Shell kann man ja soooo tolle Sachen machen)

bernhard

es gibt das nuetzliche Programm rename. Damit loest man das
beschriebene Problem mit einem Aufruf von

rename on off ?linkon.*

mehr infos mit

man rename

aufruf trifft es gut, denn bei meinem bsd system gibts das nur als posix funktion. den wrapper muss man sich da selber schreiben :frowning:

dann doch lieber den shell einzeiler, der tut ueberall wo’s ne bourneshell gibt…

joachim