• This forum has a zero tolerance policy regarding spam. If you register here to publish advertising, your user account will be deleted without further questions.

per Batch letzte 8 Zeichen des Namens löschen

stefkey

Member
Hallo,

ich müsste von ca 200 Dateien die letzten 8 Zeichen des Namens löschen.
Weiß jemand von den Profis ausm Hut wie das zu erledigen ist. Ist doch sicher ein Einzeiler oder?

Grüße, stefkey
 
Ist nicht sonderlich hübsch, aber das hier sollte tun was du verlangst
Code:
temp="Ein Test12345678"
echo ${temp:0:$((${#temp})) - 8}
 
Last edited by a moderator:
Danke euch, hmm so richtig weiter bringt mich das nicht. Ich habe jetzt folgenden Code, hier wird der Namen nur ausgegeben mit echo $file.
Was ist zu tun wenn ich aus $file die letzten 8 Zeichen des Namens entfernen möchte und auch die Datei so umbenennt - nicht nur anzeigen. Die Datei soll umbenannt werden.

Code:
#!/bin/bash

find orginalname* -type f | while read file
do
echo $file
done
 
Einfache For-Schleife?

Code:
for i in $(ls originalname*); do mv $i $(echo $i | sed 's/.\{8\}$//'); done

Gruß
Markus
 
Geil, das isses:

Code:
#!/bin/bash

find * -type f | while read file
do
echo $file
for i in $file; do mv $i $(echo $i | sed 's/.\{7\}$//'); done
done

Vielen, vielen Dank an alle, ich muss noch viel lernen :mad:
 
Aus dem Kopf, also ungetestet:
Code:
find /path -type f -name orig* -print0 | xargs -0 -I file mv file ${file:(-8)}
Stolpert nicht über Leer/Sonderzeichen in Dateinamen und spart die for/while Schleife.

EDIT: Funktioniert nicht :(
 
Last edited by a moderator:
Perls rename oder prename ;)

rename 's/(.{8})$//' *.jpg

oder perlmv aus App::perlmv
 
Last edited by a moderator:
Getestete Version, bash-only:
Code:
#!/bin/bash
for f in `find /tmp -type f -name origfile* -print0 | xargs -0`
do
 mv "$f" "${f:0:$((${#f}-8))}"
done
 
Last edited by a moderator:
Also eigentlich reichte meine for-Schleife ohne find, ohne alles...

die "Suche" macht das "$(ls originalname*).

Edit: Aufpassen bei Leerzeichen (und Sonderzeichen).

Gruß
Markus
 
Sorry, diese Fassung berücksichtigt Leer/Sonderzeichen korrekt:
Code:
#!/bin/bash
cd /path/to/work/in
find . -type f -name origfile* -print0 | xargs -0 -I % echo % | while read f
do
 mv "$f" "${f:0:$((${#f}-8))}"
done
Leider bash-only, für andere Shells ist mehr Aufwand nötig.


Nicht getestet habe ich den Fall, dass der Dateiname des Originalfile weniger als 9 Zeichen lang ist. Das ist eine Hausaufgabe für Dich ;)


BTW: Deine einfache Version kommt schnell ins Stolpern, daher würde ich sie nicht verwenden.
 
Mit ein paar "-Zeichen funktionieren auch Leerzeichen.

Gruß
Markus
Code:
for i in "$(ls *)"; do mv "$i" "$(echo $i | sed 's/.\{8\}$//')"; done
 
Ein nicht unübliches "alias ls=ls -l" und peng. Ist nur ein Beispiel um Deine Version zu borken. Newline wäre ein Weiteres. Symlinks etc. kommen auch noch dazu...
Was nicht heisst, dass meine nicht zu borken ist, ist aber etwas schwieriger ;)

Problematisch in beiden Versionen bleiben definitiv Dateinamen <9 Zeichen.
 
Last edited by a moderator:
Problematisch in beiden Versionen bleiben definitiv Dateinamen <9 Zeichen.

Die kann man bestimmt mit IF then ausschliesen
Code:
#!/bin/bash
cd /path/to/work/in
find . -type f -name origfile* -print0 | xargs -0 -I % echo % | while read f
do
 if [ ${#f} > 8 ]
   then
     mv "$f" "${f:0:$((${#f}-8))}"
   fi
done
 
Problematisch in beiden Versionen bleiben definitiv Dateinamen <9 Zeichen.
Die kann man bestimmt mit IF then ausschliesen
Wenn die Namen garantiert alle länger als 8 Zeichen sind, wäre diese Frage eh nicht mehr relevant. Insoweit sollte man hier im Vorfeld vielleicht hinterfragen, nach welchen Konventionen die Namensvergabe der betroffenen Dateien erfolgt ist.
Weiterhin könnte es auch noch problematisch werden, wenn es nach der Kürzung der Dateinamen zu Namensdubletten kommt...
 
Sieht ja fast wie Zeilenrauschen (Perl) aus :-D

Wenn ich so Zeichensalat sehe, nehme ich eine andere Sprache, selbst wenn ich dort Find neu implementieren müsste. Immer noch besser als while | read oder andere komische Hilfskonstrukte.
 
Back
Top