567 Stimmen

Wie benenne ich die Erweiterung einer Reihe von Dateien um?

In einem Verzeichnis habe ich ein Bündel von *.html Dateien. Ich würde sie gerne alle umbenennen in *.txt

Wie kann ich das tun? Ich verwende die Bash-Shell.

8voto

A.A Punkte 1128

Hier ist ein Beispiel für den Befehl rename:

rename -n ’s/\.htm$/\.html/’ *.htm

Das -n bedeutet, dass es sich um einen Testlauf handelt und keine Dateien verändert werden. Es wird Ihnen eine Liste der Dateien angezeigt, die umbenannt würden, wenn Sie das -n entfernen. Im obigen Fall werden alle Dateien im aktuellen Verzeichnis mit der Dateierweiterung .htm in .html umbenannt.

Wenn die Ausgabe des obigen Testlaufs in Ordnung war, können Sie die endgültige Version ausführen:

rename -v ’s/\.htm$/\.html/’ *.htm

Das -v ist optional, aber es ist eine gute Idee, es einzuschließen, weil es die einzige Aufzeichnung ist, die Sie von den Änderungen haben, die durch den Befehl rename gemacht wurden, wie in der Beispielausgabe unten gezeigt:

$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html

Der knifflige Teil in der Mitte ist eine Perl-Substitution mit regulären Ausdrücken, die unten hervorgehoben wird:

rename -v ’s/\.htm$/\.html/’ *.htm

7voto

Eine Zeile, keine Schleifen:

ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}

Beispiel:

$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json  ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt  ac8453e2-0d82-4d43-b80e-205edb754700.txt

5voto

Roko Mijic Punkte 5857

El Befehl mmv scheint diese Aufgabe bei einer großen Anzahl von Dateien (Zehntausende in einer Sekunde) sehr effizient zu erledigen. Zum Beispiel, um alle Dateien umzubenennen .xml Dateien zu .html Dateien, verwenden Sie dies:

mmv ";*.xml" "#1#2.html"

el ; wird mit dem Pfad übereinstimmen, die * mit dem Dateinamen übereinstimmen, und diese werden bezeichnet als #1 y #2 im Ersetzungsnamen.

Die Antworten basieren auf exec oder Pipes waren entweder zu langsam oder schlugen bei einer sehr großen Anzahl von Dateien fehl.

4voto

Marcos Punkte 4578

Nach dem Crawlen der Website eines anderen Nutzers hatte ich Tausende von Dateien, denen die .html-Erweiterung fehlte, in einem großen Baum von Unterverzeichnissen.

Um sie alle auf einmal umzubenennen, mit Ausnahme der Dateien, die bereits eine .html-Erweiterung haben (die meisten hatten gar keine), hat das bei mir funktioniert:

cd wwwroot
find . -xtype f \! -iname *.html   -exec mv -iv "{}"  "{}.html"  \;  # batch rename files to append .html suffix IF MISSING

Im Fall des Auftraggebers würde ich das leicht ändern und nur *.txt-Dateien umbenennen, etwa so:

find . -xtype f  -iname *.txt   -exec filename="{}"  mv -iv ${filename%.*}.{txt,html}  \; 

Abgebrochen (Hammertime!):

-iname *.txt
- Bedeutet, dass NUR Dateien berücksichtigt werden, die bereits auf .txt enden

mv -iv "{}.{txt,html}" - Wenn finden. einen {} als Dateinamen übergibt, extrahiert ${Dateiname%.*} den Basisnamen ohne jegliche Erweiterung, um die Parameter für mv . bash nimmt den {txt,html}, um ihn als zwei Parameter umzuschreiben, so dass der endgültige Befehl wie folgt läuft: mv -iv "filename.txt" "filename.html"

Korrektur erforderlich: Umgang mit Leerzeichen in Dateinamen

4voto

P Sreedhar Punkte 667

Versuchen Sie dies

rename .html .txt *.html 

Verwendung:

rename [find] [replace_with] [criteria]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X