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
 

Impact

Registered User
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:

stefkey

Member
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
 

storvi

New Member
Einfache For-Schleife?

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

Gruß
Markus
 

stefkey

Member
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:
 

Joe User

Zentrum der Macht
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:

GwenDragon

Registered User
Perls rename oder prename ;)

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

oder perlmv aus App::perlmv
 
Last edited by a moderator:

Joe User

Zentrum der Macht
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:

storvi

New Member
Also eigentlich reichte meine for-Schleife ohne find, ohne alles...

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

Edit: Aufpassen bei Leerzeichen (und Sonderzeichen).

Gruß
Markus
 

Joe User

Zentrum der Macht
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.
 

storvi

New Member
Mit ein paar "-Zeichen funktionieren auch Leerzeichen.

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

Joe User

Zentrum der Macht
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:

rolapp

Fan vom SSF
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
 

nexus

Well-Known Member
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...
 

DeaD_EyE

Blog Benutzer
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.
 
Top