Benennen Sie eine Gruppe von Dateien mit einem Befehl um

28072
Richard Hoskins

Wie kann ich alle Dateien in .html umbenennen, wenn ich eine Gruppe von Dateien mit der Erweiterung .htm habe?

mv *.htm *.html 

funktioniert nicht.

37
Nur der Vollständigkeit halber funktioniert `ren * .htm * .html` unter Windows. Brian Burns vor 9 Jahren 0

8 Antworten auf die Frage

50
falstro

Oder Sie könnten pure bash verwenden ... (außer für mv, das heißt ..)

for file in *.htm; do mv "$file" "$.html"; done 

und vermeiden Sie die unangenehmen Basename-Sachen. ;)

Bash bietet einen umfangreichen Satz an variablen Erweiterungsoptionen. Das hier verwendete '%' entfernt das kleinste übereinstimmende Suffix aus dem Wert der Variablen. Das Muster ist ein Glob-Muster, $würde also auch funktionieren. Der '%%'-Operator entfernt das größte übereinstimmende Suffix und ist im obigen Beispiel austauschbar, da das Muster fest ist und $.htmlabhtm jedoch in a.html umgewandelt wird.

Weitere nützliche Tricks finden Sie im Abschnitt zu den variablen Unterprogrammen der bash-Manpage. Innerhalb von bash kann man eine Menge tun.

Beachten Sie auch, dass diese Parametererweiterungen nicht auf * bash * beschränkt sind. Sie sind auf allen von Bourne abgeleiteten Shells verfügbar (* sh *, * ksh *, * bash *, * zsh *, * dash *, * ash * usw.). Die Erweiterungen sind Teil der [POSIX-Spezifikation für die "Shell Command Language" (http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02) und sind sehr portabel. Chris Johnsen vor 13 Jahren 1
11
TRS-80

rename(1)ist ein Perl-Dienstprogramm, das genau das macht, was Sie möchten. In diesem Fall:

rename 's/\.htm$/.html/' *htm

oder wenn Sie auch Unterverzeichnisse verwenden

(erfordert Bash 4.0 und die globstar Einstellung: shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm

Umbenennen ist einfacher, aber kein Standard-Unix-Programm. Die ursprüngliche Frage gibt nicht an, welches Unix. Scheint an manchen Stellen "Vorname" zu sein. freiheit vor 14 Jahren 1
"rename" kommt mit Perl, und im Grunde kommt heutzutage jeder Unix mit Perl. TRS-80 vor 14 Jahren 2
ja, aber nicht zu jedem Unix gehören Hilfsprogramme wie 'rename', wenn sie perl in das System einfügen. OSX zum Beispiel hat kein "Umbenennen". freiheit vor 14 Jahren 3
@William: Die doppelte Sternchen-Syntax ist nur in Bash 4 und höher verfügbar und nur, wenn sie mit `shopt -s globstar` aktiviert ist (standardmäßig deaktiviert). Linux und Unix haben auch Verzeichnisse und keine Ordner. Dennis Williamson vor 11 Jahren 1
11
Dennis Williamson

Es dürfen keine Leerzeichen, Zeilenumbrüche oder andere Leerzeichen in den Dateinamen sein, aber diese Version der Antwort von freiheit behandelt diese. Es verwendet auch $()anstelle von Backticks zur besseren Lesbarkeit zusammen mit anderen Vorteilen.

for file in *.htm do mv "$file" "$(basename "$file" .htm).html" done 

Noch besser - für den speziellen Fall, dass Sie am Ende nur noch etwas hinzufügen:

for file in *.htm do mv "$file" "$l" done 
6
freiheit
for file in *.htm; do mv $file `basename "$file" .htm`.html done 

Versuchen Sie es mit einem echovor dem mversten Mal.

Das Problem bei Ihrem Original ist, dass " mv *.htm *.html" die *s von der Shell gehandhabt werden, so dass der mvBefehl einfach eine Liste aller .htm- und .html-Dateien im aktuellen Verzeichnis sieht. Mit anderen Worten, etwas wie " mv foo.htm bar.htm stuff.htm six.htm file.htm". mv kann nur mit mehr als 2 Argumenten umgehen, wenn das letzte ein Verzeichnis ist.

Sie sollten "$ file" zitieren, um Leerzeichen zu behandeln. Richard Hoskins vor 14 Jahren 1
Ihre Beschreibung des ursprünglichen Problems sollte stärker betont werden. Dieses Shell-Wildcard-Erweiterungsverhalten ist für jemanden, der aus Windows land kommt, überraschend und nicht intuitiv. Wenn man die Funktion der Shell erkennt, wird deutlich, warum die ursprüngliche Anwendung von 'mv' nicht funktioniert. Greg Hewgill vor 14 Jahren 0
3
xalupadas

Noch ein reines Bash-Beispiel, das String ersetzen.

for file in *.htm; do mv $file $; done 

Extra - dies ersetzt alle Vorkommen einer Zeichenfolge

for file in *.htm; do mv $file $; done 
1
Martin

Wenn Sie Zsh verwenden, können Sie 'zmv' verwenden.

1
bortzmeyer

Das beste Werkzeug ist mmv .

mmv \*.htm #1.html 

Weitere Anwendungsbeispiele (und andere Tools) in "Zusammenfassung der GNU / Linux-Befehlszeilen-Tools ".

Ihr Verwendungsbeispiel schlägt fehl. Sie müssen "#" entkommen. Cristian Ciupitu vor 14 Jahren 1
Nein, es funktioniert (ich teste IMMER, bevor ich SuperUser poste). Die Notwendigkeit, # zu umgehen, hängt von der verwendeten Shell ab (ich verwende zsh). bortzmeyer vor 14 Jahren 0
0
Cristian Ciupitu

Das Paket util-linux-ng (auf Fedora) hat einen renameähnlichen Befehl wie der von TRS-80 erwähnte . Sie können es so verwenden:

rename .htm .html *.html