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.
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.
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
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
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.
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
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.