Linux Notizen / Rename Multiple Files
 
StartSeite | LinuxNotizen/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Wenn folgende Files existieren:
  test1.txt
  test2.txt
  test3.txt
die man mit einem Befehl in
  test1.htm
  test2.htm
  test3.htm
umbenennen möchte, dann geht das unter DosWindows mit

ren test*.txt test*.htm

Unter Linux geht es mit

rename .txt .htm test*.txt

(mit util-linux rename).

Eine vorgeschlagene Lösung für eine csh ist aus einer FAQ:

% foreach file (test*.txt)
> mv $file `basename $file .txt`.htm
> end

Frage: Gibt es andere (einfachere, bessere) Varianten?

Antwort #1: Für diese und andere Operationen auf mehreren Files empfiehlt sich mmv. Das ist unabhängig von der Shell, forkt nicht, schleift nicht, braucht nicht programmiert zu werden und funktioniert auch rekursiv in und mit Verzeichnissen.

Für das angegeben Beispiel würde man einfach

mmv '*.txt' '#1.htm'

schreiben (Achtung auf das Quoting!). Alleine die Zeit, die ich man sich da beim Tippen spart, schlägt jede Effizienzsteigerung der Implementierung.

mmv ist zwar für die meisten Distributionen verfügbar, man muss es aber auch ebensooft nachinstallieren, da es nicht zu den traditionellen "Standardtools" gehört.

Namensänderungen, die über einfache Stringersetzungen hinausgehen kann man zum Beispiel mittels

find -name '*.txt' | sed -e 's/^\(\(.*\)foo\(.*\)\)$/\1 \2bar\3/' | mmv

implementieren. Leider kann mmv über dieses Interface keine Filenamen, die Spaces enthalten, bearbeiten.

Antwort #2: Siehe UnixFAQ:2.6 ("How do I rename '*.foo' to '*.bar', or change file names to lowercase?").

Antwort #3: Deutlich einfachere gibt es wohl nicht, aber wesentlich performantere (~x40)(nur mit ShellBsh) und welche, die auch bei vorkommenden Zwischenraumzeichen funktionieren.

for F in test*.txt
do
   expr "$F" :Fneu '.txt$' = '.htm'
   move "$F" "$Fneu"
done

Antwort #4:

Bei der typischen SprachePerl-Installation ist /usr/bin/rename dabei, das beliebige Perlfragmente auf Filenamen anwendet.

Antwort #5:

Ich denke #1 und #2 sind am einfachsten zu handeln. #3 und #4 sind "spezial" Lösungen die auf Skriptsprachen basieren. Wenn man die Tools entsprechend installiert hat, sind eigentlich alle Lösungen gut. Für eine andere Lösung mit einem anderen Tool könnt ihr unter SCSH nachschauen. In diesem Fall wäre es ein:

  (operate-on "." rename-file
              (lambda (file) (replace-extension file ".htm"))
              "test*")

Antwort #6:

Im dired Modus des LinuxWiki:emacs kann man das Verzeichnis "öffnen" und beliebige emacs-Operationen auf die Filenamen anwenden.

Links


KategorieUnix KategorieLinux
StartSeite | LinuxNotizen/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 24. August 2004 16:53 (diff))
Suchbegriff: gesucht wird
im Titel
im Text