Mehrfach umbennen in der Bash

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Mightymod
Beiträge: 71
Registriert: 24.06.2004 16:26:03
Kontaktdaten:

Mehrfach umbennen in der Bash

Beitrag von Mightymod » 15.12.2006 23:04:06

Hallo,

ich möchte (rekursiv) alle Datein mit der Endung .txt in .doc umbenennen. Ich habe keine Idee, wie ich das auf der Bash machen kann.

Kann mir wer einen Tipp geben ?

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von goeb » 16.12.2006 00:13:23

Gibt sicher elegantere Varianten, aber

Code: Alles auswählen

rename 's/^(.*)\.txt$/$1.doc/' *.txt
sollte funktionieren (ungetestet).

MfG, goeb

Edit: ups, du willst es rekursiv, dann mußt du entweder das Ganze in einem Skript "rekursieren" :wink: oder mit find hantieren.

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 16.12.2006 07:29:06

Hallo Mightymod,

aus meiner Sicht sollte es mit einer Kombination von "find" und "rename" gehen. :wink:
http://www.linux-user.de/ausgabe/2000/0 ... efehl.html

Gruß fuzzy

DeletedUserReAsG

OT

Beitrag von DeletedUserReAsG » 16.12.2006 07:44:06

sollte funktionieren (ungetestet)
Zum Testen solcher Sachen habe ich ein entsprechend gefülltes Verzeichnis. Finde ich besser, als 'ungetestet' hinzuschreiben, denn manchmal schleicht sich beim "On the fly-Basteln" doch ein Fehler ein. Nicht böse gemeint, ist mir nur schon öfter aufgefallen. Insbesondere "Anfänger" messen dem Hinweis 'ungetestet' oft nicht die ihm zustehende Bedeutung bei ;)

cu

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von goeb » 16.12.2006 09:38:56

Wenn es ein Befehl gewesen wäre mit dem man etwas kaputt machen könnte hätte ich vorher ein bißchen rumprobiert, aber obiges rename ist harmlos. (Und wenn ich dann einmal anfange ein Skript zu basteln werd ich so schnell nicht wieder fertig :wink:) Allerdings hätte ich das (ungetestet) auch einfach weglassen können, ich bin mir zu 100% sicher das der obige Befehl genau das macht was Mightymod möchte (nur nicht rekursiv).

MfG, goeb

DeletedUserReAsG

Beitrag von DeletedUserReAsG » 16.12.2006 13:14:27

War auch nicht speziell auf dich oder diesen Thread bezogen. Fiel mir halt hier wieder auf, und da ich heute sowieso mtteilungsbedürftig bin (...) ;)

cu

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

Beitrag von roli » 18.12.2006 11:37:15

Hi,

versuchs mal mit mmv (multiple move).
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"

withorwithoutaname
Beiträge: 30
Registriert: 27.11.2006 11:51:22

Beitrag von withorwithoutaname » 18.12.2006 11:42:03

Code: Alles auswählen

for i in $(ls *.txt); do mv $i ${i%.txt}.doc; done
Klappt aber leider nur, wenn alle Filenamen keine Leerezeichen enthalten.

Cheers,
DS

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 18.12.2006 12:40:04

withorwithoutaname hat geschrieben:

Code: Alles auswählen

for i in $(ls *.txt); do mv $i ${i%.txt}.doc; done
Klappt aber leider nur, wenn alle Filenamen keine Leerezeichen enthalten.

Cheers,
DS
Versuch mal

Code: Alles auswählen

for i in $(ls -Q *.txt); do mv $i ${i%.txt}.doc; done
Damit packt ls alle Dateien in Double-Quotes.

withorwithoutaname
Beiträge: 30
Registriert: 27.11.2006 11:51:22

Lösung

Beitrag von withorwithoutaname » 13.04.2007 08:43:15

So, ich hab's jetzt rausgefunden, leere oder Variablen mit Leerzeichen müssen in Doublequotes gesetzt werden, und zwar geht das einfach so:

Code: Alles auswählen

for i in "$(ls *.txt)"; do mv $i ${i%.txt}.doc; done
 
Gute Seite mit Einsteigertips zum Thema "shell scripting": http://pegasus.rutgers.edu/~elflord/unix/bash-tute.html

Cheers,
DS

Antworten