Re: rename - Änderung von Dateinamen

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Mon, 27 Jul 2015 11:23:20 +0200 (CEST)

Franz Timmer <ml(at)ft-c.de> wrote:
> Hallo,
>
> ich benötige eine Skript-Spezialisten:
>
> folgender Befehl ersetzt alle Leerzeichen in den Dateinamen mit dem
> Unterstrich:
>
> rename -R '-s/ /_/g' *
>
> Jetzt hätte ich gern ein Prefix vor dem Dateinamen.
>
> rename -R '-s/(.*)/aa_$1/g' * # funktioniert leider nicht.
>
> Gibt es hierfür auch eine Ein-Zeilen-Lösung auf FreeBSD?

Obiges "rename" kenne ich nicht; es gehört jedenfalls nicht
zu FreeBSD. Daher kann ich nicht sagen, mit welcher Syntax
es aufzurufen ist.

Aber für derlei Dinge habe ich vor Urzeiten mal ein kleines
Skript geschrieben, das Dir weiterhelfen sollte:

http://www.secnetix.de/olli/scripts/Generic-utilities/ren

Leerzeichen in Unterstriche umwandeln geht damit so:

$ ren ' ' _

Und einen Prefix "aa_" davorsetzen geht so:

$ ren '^' aa_

Wenn keine Dateien angegeben sind, ist »*« der Default,
d.h. das Skript arbeitet auf allen Dateien im aktuellen
Verzeichnis. Das funktioniert übrigens auch, wenn
Leerzeichen in den Dateinamen vorkommen.

Wenn Du rekursiv alle Dateien bearbeiten möchtest, d.h.
auch in Unterverzeichnissen, kann man sich, wie bei UNIX
üblich, mit find+xargs behelfen:

$ find . -type f -print0 | xargs -0 ren '^' aa_

Dank »-print0« und »-0« funktioniert das auch, wenn
in den Dateien Leerzeichen oder Sonderzeichen sind.

Mit »-type f« werden nur normale Dateien umbenannt,
keine Verzeichnisse. Möchte man auf diese Weise auch
Verzeichnisse umbenennen, muss man dem find-Kommando
noch die Option -d mitgeben, damit es zuerst "in die
Tiefe" geht. Anderenfalls kann es passieren, dass
das ren-Skript Dateien vorgesetzt bekommt, die sich
in Verzeichnissen befinden, die bereits umbenannt
wurden, was dann natürlich schiefgeht.

Und der Vollständigkeit halber: Wer als Shell die
zsh verwendet, kann auch deren Globbing-Funktionen
verwenden (anstelle von find):

$ ren '^' aa_ **/*(od)

Man kann' die Details in der Manpage nachlesen, hier
nur in aller Kürze: »**/« wird rekursiv zu allen
Verzeichnissen expandiert, »**/*« also zu allen
Dateien in allen Verzeichnissen (ähnlich wie »find .«),
und der angehängte Qualifier »(od)« sorgt dafür, dass
die Einträge nach der Tiefe sortiert werden, also wie
die Option -d bei find ("od" = Order by Depth).

Gruß
   Olli

-- 
Oliver Fromme,  secnetix GmbH & Co. KG,  Marktplatz 29, 85567 Grafing
Handelsregister:  Amtsgericht Muenchen, HRA 74606, Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsreg.: Amtsgericht München,
HRB 125758, Geschäftsführer:  Maik Bachmann,  Olaf Erb,  Ralf Gebhart
FreeBSD-Dienstleistungen/-Produkte + mehr: http://www.secnetix.de/bsd
"To this day, many C programmers believe that 'strong typing'
just means pounding extra hard on the keyboard."
        -- Peter van der Linden
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Mon 27 Jul 2015 - 11:23:32 CEST

search this site