Mehr Datein umbenennen, auch solche mit Leerzeichen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
rksteve
Beiträge: 716
Registriert: 11.09.2003 12:24:53
Kontaktdaten:

Mehr Datein umbenennen, auch solche mit Leerzeichen

Beitrag von rksteve » 09.01.2008 20:55:31

Hallo!

Ich will alle Dateien in einem Verzeichnis eine Dateiendung anhängen. Das sollte folgende Zeile erledigen:
for tmp in $(ls); do mv $tmp $tmp.ogg; done

Die Dateien haben allerdings Leerzeichen im Namen, wie muss ich mein Script jetzt anpassen?
Alternative könntet ihr mir auch erklären wie ich in allen Dateinamen das Leerzeichen durch einen Unterstrich _ erstetzte.

Danke schon mal,
Gruss
Steve
Ich? Nein, ich bin keine Signatur, ich mach hier nur sauber...

Benutzeravatar
mathias.bonert
Beiträge: 53
Registriert: 15.06.2007 20:34:28
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von mathias.bonert » 09.01.2008 21:51:23

for i in *; do mv "$i" `echo $i | tr ' ' '_'`; done

Damit werden Unterstriche in jedem Dateinamen im Ordner eingesetzt Wenn du deinen Script fertig hast stell ihn bitte hier rein.

Gruss Mathias

Benutzeravatar
rksteve
Beiträge: 716
Registriert: 11.09.2003 12:24:53
Kontaktdaten:

Beitrag von rksteve » 09.01.2008 22:11:28

Danke, hat funktioniert.

Script gibt es keins, das ist ein Einzeiler den ich so in der Bash ausgeführt habe.
Ich? Nein, ich bin keine Signatur, ich mach hier nur sauber...

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 10.01.2008 09:04:44

Hi,

um mehrere Dateien auf einmal umzubenennen koenntest du auch "mmv" verwenden.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Spiff
Beiträge: 9
Registriert: 11.01.2004 11:51:04

Beitrag von Spiff » 10.01.2008 09:21:51

Für sowas gibt's das Skript 'prename'.

Code: Alles auswählen

Usage: rename [-v] [-n] [-f] perlexpr [filenames]
Man muss sich ein wenig mit Regular Expressions (RE) auskennen. Wenn man aber nicht zu kompliziertes machen will reicht der normale Menschenverstand (glaube ich ;) )

Obiges Problem reduziert sich auf

Code: Alles auswählen

prename 's/$/.ogg/' *
Die RE bedeutet: ersetze das Ende des Strings ($) durch den String '.ogg'.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 10.01.2008 10:58:50

Sehr interessant das Tool prename (kannte ich noch nicht).

Normalerweise müsste man ja bei der Benutzung von RE alles bis zum Ende speichern und bei der Ersetzung darauf zurückgreifen und das gewünschte hinten anhängen.
Oh, yeah!

Spiff
Beiträge: 9
Registriert: 11.01.2004 11:51:04

Beitrag von Spiff » 10.01.2008 12:10:07

Duff hat geschrieben: Normalerweise müsste man ja bei der Benutzung von RE alles bis zum Ende speichern und bei der Ersetzung darauf zurückgreifen und das gewünschte hinten anhängen.
Nein, man ersetzt ja nur einen Teil des Strings, hier eben das Ende, das mit dem Spezialzeichen '$' symbolisiert wird.

Wenn Du zB in allen Dateien alle Unterstriche durch Leerzeichen ersetzen wolltest, ginge das so:

Code: Alles auswählen

prename 's/_/ /g' *
Das 'g' am Ende bedeutet 'global' also alle Ersetzungen durchführen. Per default wird nämlich nur eine Ersetzung gemacht.

Natürlich lassen sich auch komplexe Sachen machen. Wenn man zB das Format "Artist - Title.mp3" hat, aber lieber "Title - Artist.mp3" hätte, geht das so:

Code: Alles auswählen

prename 's/^(.*) - (.*).mp3/$2 - $1.mp3/' *

Eine Doku bekommst Du mittels

Code: Alles auswählen

perldoc perlre

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 10.01.2008 12:22:28

...dass ist ja noch besser, dass es sich dabei um perl handelt :wink:
Oh, yeah!

gladiator
Beiträge: 34
Registriert: 23.10.2007 12:59:32

Beitrag von gladiator » 15.01.2008 18:03:20

wenn du stat ls find benuzt funktioinirt es auch. und ich finde das skirpt is so einfach viel schöner.

Code: Alles auswählen

for tmp in $(find)
   do mv $tmp $tmp.ogg
done 

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 15.01.2008 19:40:07

Würde ja mal sagen, viele Wege führen nach Rom, aber bei mir funktioniert es so nicht!

Code: Alles auswählen

daniel@daniel-laptop:/tmp$ find . -maxdepth 1 -type f -a -name "t*" -exec ls {} \;
./test.t.oo
./test leer
daniel@daniel-laptop:/tmp$ for i in $(find . -maxdepth 1 -type f -a -name "t*"); do
> mv $i $i.oo
> done
mv: Aufruf von stat für »./test« nicht möglich: Datei oder Verzeichnis nicht gefunden
mv: Aufruf von stat für »leer« nicht möglich: Datei oder Verzeichnis nicht gefunden
Die Datei test leer wird kann nicht wirklich umbenannt werden.
Oh, yeah!

Spiff
Beiträge: 9
Registriert: 11.01.2004 11:51:04

Beitrag von Spiff » 16.01.2008 12:55:20

gladiator hat geschrieben:wenn du stat ls find benuzt funktioinirt es auch. und ich finde das skirpt is so einfach viel schöner.

Code: Alles auswählen

for tmp in $(find)
   do mv $tmp $tmp.ogg
done 
Hier musst Du die Leerzeichen aber noch durch Anführungszeichen schützen "$tmp" statt nur $tmp.

Aber dann doch lieber gleich nur das find

Code: Alles auswählen

find ./ -name '*.mp3' -exec mv {} {}.ogg \;

comes
Beiträge: 2702
Registriert: 11.03.2005 07:33:30
Wohnort: /dev/null
Kontaktdaten:

Beitrag von comes » 16.01.2008 13:07:46

ohne kleinlisch zu wirken...
aber durch das umbenennen einer mp3 datei nach ogg, ist das nicht zwingend eine ogg datei
grüße, comes

Faschismus ist keine Meinung, sondern ein Verbrechen!
http://sourcewars.de

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 16.01.2008 13:12:05

comes hat geschrieben:ohne kleinlisch zu wirken...
aber durch das umbenennen einer mp3 datei nach ogg, ist das nicht zwingend eine ogg datei
Das ist natürlich wahr.
Aber es ging mehr darum, wie man das "Umbenennen" auf verschiedene Art und Weise lösen kann.
Oh, yeah!

Antworten