Wie benenne ich die Erweiterung für eine Reihe von Dateien um?
-
22-07-2019 - |
Frage
In einem Verzeichnis habe ich eine Menge *.html
Dateien.Ich würde sie gerne alle in umbenennen *.txt
Wie kann ich das machen?Ich verwende die Bash-Shell.
Lösung
Eine bessere Lösung (nur mit Bash-Funktionalität im Gegensatz zu externen Aufrufen) finden Sie unter eine der anderen Antworten.
Das Folgende würde genügen und erfordert nicht, dass das System über Folgendes verfügt rename
Programm (obwohl Sie dies am häufigsten auf einem System haben):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
BEARBEITEN: Wie in den Kommentaren erwähnt, funktioniert dies nicht für Dateinamen mit Leerzeichen ohne korrekte Anführungszeichen (jetzt oben hinzugefügt).Wenn Sie ausschließlich an Ihren eigenen Dateien arbeiten, von denen Sie wissen, dass die Dateinamen keine Leerzeichen enthalten, funktioniert dies. Wenn Sie jedoch etwas schreiben, das zu einem späteren Zeitpunkt wiederverwendet werden kann, überspringen Sie nicht die richtigen Anführungszeichen.
Andere Tipps
Wenn bash verwenden, gibt es keine Notwendigkeit für externe Kommandos wie sed, Basisnamen, umbenennen, ausdr, etc.
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
rename 's/\.html$/\.txt/' *.html
genau das tut, was Sie wollen.
Das funktionierte für mich auf OSX von .txt .txt_bak
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
Sie verwenden möchten rename
:
rename -S .html .txt *.html
Das ist genau das, was Sie wollen - es wird die Erweiterung von .html
für alle Dateien passenden .txt
*.html
ändern
Hinweis: Greg Hewgill betont zu Recht, dies ist kein bash builtin; und ist ein eigener Linux-Befehl. Wenn Sie nur etwas unter Linux benötigen, sollten diese gut funktionieren; wenn man etwas mehr Cross-Plattform dann werfen Sie einen Blick auf eines der anderen Antworten benötigt.
Auf einem Mac ...
- Installieren Umbenennungs wenn Sie nicht haben:
brew install rename
-
rename -S .html .txt *.html
Für Ubuntu-Benutzer:
rename 's/\.html$/\.txt/' *.html
Hier ist ein Beispiel für den Umbenennungs Befehl:
rename -n ’s/\.htm$/\.html/’ *.htm
Die -n bedeutet, dass es ein Testlauf ist und wird nicht wirklich alle Dateien ändern. Es zeigt Ihnen eine Liste von Dateien, die umbenannt werden würde, wenn Sie die -n entfernt. Im obigen Fall, wird alle Dateien im aktuellen Verzeichnis aus einer Dateierweiterung von HTM konvertieren .html.
Wenn die Ausgabe des obigen Testlauf sah ok, dann können Sie die endgültige Version laufen:
rename -v ’s/\.htm$/\.html/’ *.htm
Die -v ist optional, aber es ist eine gute Idee, es zu schließen, weil es die einzige Aufzeichnung ist, werden Sie von Änderungen, die durch den Umbenennungs Befehl gemacht wurden, wie unten in der Beispielausgabe 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 schwierige Teil in der Mitte ist eine Perl-Substitution mit regulären Ausdrücken, hervorgehoben unten:
rename -v ’s/\.htm$/\.html/’ *.htm
Nach einem fremden Website kriecht, landete ich mit Tausenden von Dateien fehlen die Erweiterung .html up, in einem breiten Baum von Unterverzeichnissen.
Um sie alle in einem Schuss, mit Ausnahme der Dateien umbenennen bereits eine Erweiterung .html mit (die meisten von ihnen hatten gar keine), das für mich gearbeitet:
cd wwwroot
find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
Im Fall des OP könnte ich, dass etwas ändern, nur * .txt-Dateien umbenennen, etwa so:
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
Gegliedert (hammer!):
-iname * .txt
- Die Mittel betrachten nur die Dateien bereits in .txt Endung
mv -IV "{}. {Txt, html}"
- Wenn finden gibt ein {} als Dateinamen, $ {filename% *.} Extrahiert dessen Basisnamen ohne Erweiterung, um die Parameter zu bilden mv . bash nimmt die {txt, html} umschreiben es als zwei Parameter so die letzten Befehl ausgeführt als: mv -iv "filename.txt" "filename.html"
Fix benötigt aber: mit Leerzeichen in Dateinamen zu tun
Diese Frage ausdrücklich erwähnt Bash, aber wenn Sie haben, passieren ZSH verfügbar es ist ziemlich einfach:
zmv '(*).*' '$1.txt'
Wenn Sie zsh: command not found: zmv
erhalten dann einfach laufen:
autoload -U zmv
Und dann versuchen Sie es erneut.
Dank dieser für die Spitze rel="noreferrer"> etwa ZMV.
Dies ist die slickest Lösung, die ich gefunden habe, die auf OSX und Linux funktioniert, und es funktioniert gut mit git auch!
find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;
und mit git:
find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;
Die Befehl mmv
diese Aufgabe zu machen scheint sehr effizient auf einer großen Anzahl von Dateien ( Zehntausende in einer Sekunde). Um zum Beispiel alle .xml
Dateien zu umbenennen Dateien .html
, verwenden Sie diese:
mmv ";*.xml" "#1#2.html"
die ;
den Pfad übereinstimmen, wird der *
den Dateinamen übereinstimmen, und diese als #1
und #2
im Ersatz Namen bezeichnet werden.
Antworten basierend auf exec
oder Rohren waren entweder zu langsam oder nicht auf eine sehr große Anzahl von Dateien.
Versuchen Sie, diese
rename .html .txt *.html
Nutzung:
rename [find] [replace_with] [criteria]
Ein bisschen spät, um die Partei. Man könnte es mit xargs tun:
ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}
Oder, wenn alle Ihre Dateien in einigen Ordnern sind
ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
Wenn Sie PERL bevorzugen, gibt es eine kurze PERL-Skript (orignally von Larry Wall geschrieben, der Schöpfer von PERL), die genau das tun, was Sie hier wollen: tips.webdesign10.com/files/rename.pl.txt . Für Ihr Beispiel sollte die folgende den Trick
rename.pl 's/html/txt/' *.html
=)
(Danke @loretoparisi für die aktualisierte URL)
Leider ist es nicht trivial portably zu tun. Sie müssen wahrscheinlich ein bisschen ausdr Magie.
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
Nehmen Sie das Echo, wenn Sie glücklich sind, es tut, was Sie wollen.
Edit:. basename
ist wahrscheinlich ein wenig besser lesbar für diesen speziellen Fall, obwohl expr
flexibler in der Regel
Dies ist eine gute Möglichkeit, mehrere Erweiterungen auf einmal zu ändern:
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
Hinweis: bei der Erweiterung Größe vorsichtig sein, das gleiches (das ???) sein
Nice & einfach!
find . -iname *.html -exec mv {} "$(basename {} .html).text" \;
Hier ist, was ich verwenden .edge
Dateien umbenennen .blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
Funktioniert wie Charme.
Eine Zeile, keine Schleifen:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
cbongiorno@ip-172-31-26-242:~/pgsql$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
cbongiorno@ip-172-31-26-242:~/pgsql$