In einem Verzeichnis habe ich eine Reihe von *.html
Dateien. Ich möchte sie alle umbenennen*.txt
Wie kann ich das machen? Ich benutze die Bash-Shell.
quelle
In einem Verzeichnis habe ich eine Reihe von *.html
Dateien. Ich möchte sie alle umbenennen*.txt
Wie kann ich das machen? Ich benutze die Bash-Shell.
Eine bessere Lösung (mit nur Bash-Funktionalität im Gegensatz zu externen Anrufen) finden Sie in einer der anderen Antworten .
Folgendes würde erfordern und nicht erfordern, dass das System das rename
Programm hat (obwohl Sie dies am häufigsten auf einem System haben würden):
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 korrektes Anführungszeichen (jetzt oben hinzugefügt). Wenn Sie nur an Ihren eigenen Dateien arbeiten, von denen Sie wissen, dass sie keine Leerzeichen in den Dateinamen enthalten, funktioniert dies. Wenn Sie jedoch etwas schreiben, das zu einem späteren Zeitpunkt wiederverwendet werden kann, überspringen Sie nicht das richtige Anführungszeichen.
ren *.a *.b
$()
Syntax anstelle der alten Backtick-Syntax. Verbessert die Lesbarkeit und macht die Syntax weniger eindeutig, wenn Sie Zeichen haben, für die ein Backslash-Escape erforderlich wäre, um innerhalb der Befehlsersetzung durch letztere wörtlich zu sein.Wenn Sie bash verwenden, sind keine externen Befehle wie sed, basename, rename, expr usw. erforderlich.
quelle
"${file%.*}.txt"
, kann dies für Dateien ohne Erweiterung gefährlich sein.$
in den geschweiften Klammern keine befindet !--
"Operator": mv - "$ file" "$ {file% .html} .txt" Dieser Operator verhindert Dateinamen, die mit beginnen ein '-' von mv als Argumente analysiert.macht genau das, was Sie wollen.
quelle
Dies funktionierte für mich unter OSX von .txt bis .txt_bak
quelle
.txt
zu zu gehen , müssen.txt_bak
Sie nur verketten_bak
;).scss
in.sass
(nach In-Place-Konvertierung…):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
Sie möchten verwenden
rename
:Dies ist genau das, was Sie wollen - es wird die Erweiterung ändern aus ,
.html
um.txt
für alle Dateien Matching*.html
.Hinweis: Greg Hewgill weist korrekt darauf hin, dass dies keine eingebaute Bash ist. und ist ein separater Linux-Befehl. Wenn Sie nur etwas unter Linux benötigen, sollte dies gut funktionieren. Wenn Sie etwas plattformübergreifenderes benötigen, schauen Sie sich eine der anderen Antworten an.
quelle
rename
Programm nicht mitbash
allen Plattformen verbunden und auch nicht auf allen Plattformen verfügbar. Ich habe es nur unter Linux gesehen.rename -S .html .text *.html
wo-S
steht für--subst-all
Auf einem Mac ...
brew install rename
rename -S .html .txt *.html
quelle
Für Ubuntu-Benutzer:
quelle
Dies ist die schickste Lösung, die ich gefunden habe und die unter OSX und Linux funktioniert, und sie funktioniert auch gut mit Git!
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' - '{}' \;
quelle
Hier ist ein Beispiel für den Umbenennungsbefehl:
Das -n bedeutet, dass es sich um einen Testlauf handelt und keine Dateien geändert werden. Es wird eine Liste der Dateien angezeigt, die umbenannt würden, wenn Sie das -n entfernen würden. Im obigen Fall werden alle Dateien im aktuellen Verzeichnis von einer Dateierweiterung von .htm in .html konvertiert.
Wenn die Ausgabe des obigen Testlaufs in Ordnung aussah, können Sie die endgültige Version ausführen:
Das -v ist optional, aber es ist eine gute Idee, es einzuschließen, da es der einzige Datensatz ist, den Sie über Änderungen haben, die mit dem Umbenennungsbefehl vorgenommen wurden, wie in der folgenden Beispielausgabe gezeigt:
Der schwierige Teil in der Mitte ist eine Perl-Substitution mit regulären Ausdrücken, die unten hervorgehoben wird:
quelle
In dieser Frage wird Bash ausdrücklich erwähnt, aber wenn Sie ZSH zur Verfügung haben, ist dies ziemlich einfach:
Wenn Sie
zsh: command not found: zmv
dann einfach laufen:Und dann versuchen Sie es erneut.
Vielen Dank an diesen Originalartikel für den Tipp zu zmv.
quelle
Nach dem Crawlen der Website einer anderen Person fehlten mir Tausende von Dateien mit der Erweiterung .html in einem breiten Baum von Unterverzeichnissen.
Um sie alle auf einmal umzubenennen, mit Ausnahme der Dateien, die bereits die Erweiterung .html haben (die meisten hatten überhaupt keine), funktionierte dies für mich:
Im Fall des OP könnte ich das leicht ändern, um nur * .txt-Dateien umzubenennen, wie folgt:
Aufgeschlüsselt (Hammerzeit!):
-iname * .txt
- Bedeutet, dass NUR Dateien berücksichtigt werden, die bereits mit .txt enden
mv -iv "{}. {txt, html}" - Wenn find ein {} als Dateinamen übergibt, extrahiert $ {Dateiname%. *} seinen Basisnamen ohne Erweiterung, um die Parameter für mv zu bilden . bash verwendet {txt, html}, um es als zwei Parameter neu zu schreiben, sodass der letzte Befehl wie folgt ausgeführt wird:
mv -iv "filename.txt" "filename.html"
Korrektur erforderlich: Umgang mit Leerzeichen in Dateinamen
quelle
Der Befehl
mmv
scheint diese Aufgabe für eine große Anzahl von Dateien (Zehntausende in einer Sekunde) sehr effizient auszuführen. Verwenden Sie beispielsweise Folgendes, um alle.xml
Dateien in.html
Dateien umzubenennen :Das
;
wird mit dem Pfad übereinstimmen, das*
wird mit dem Dateinamen übereinstimmen, und diese werden als#1
und#2
im Ersatznamen bezeichnet.Antworten auf
exec
oder Pipes waren entweder zu langsam oder schlugen bei einer sehr großen Anzahl von Dateien fehl.quelle
Versuche dies
Verwendungszweck:
quelle
Ein bisschen spät zur Party. Sie könnten es mit xargs tun:
Oder wenn sich alle Ihre Dateien in einem Ordner befinden
quelle
ls
. Dieser Befehl ist lächerlich: Er verwendet nutzlos einen Globus mitls
, anstatt den Globus direkt zu verwenden. Dies wird mit Dateinamen unterbrochen, die Leerzeichen, Anführungszeichen und (aufgrund fehlender Anführungszeichen) Glob-Zeichen enthalten.Dies ist eine gute Möglichkeit, mehrere Erweiterungen gleichzeitig zu ändern:
Hinweis: Achten Sie darauf, dass die Erweiterungsgröße gleich ist (die ???)
quelle
Schön und einfach!
quelle
Wenn Sie PERL bevorzugen, gibt es ein kurzes PERL-Skript (ursprünglich von Larry Wall, dem Erfinder von PERL, geschrieben), das genau das tut, was Sie hier wollen: tips.webdesign10.com/files/rename.pl.txt .
Für Ihr Beispiel sollte Folgendes den Trick tun:
quelle
Ähnlich wie zuvor vorgeschlagen, habe ich es so gemacht:
Ich habe zuerst mit validiert
quelle
Eine Zeile, keine Schleifen:
Beispiel:
quelle
Leider ist es nicht trivial, tragbar zu machen. Du brauchst wahrscheinlich ein bisschen Ausdrucksmagie.
Entfernen Sie das Echo, sobald Sie zufrieden sind, dass es das tut, was Sie wollen.
Bearbeiten:
basename
ist für diesen speziellen Fall wahrscheinlich etwas besser lesbar, obwohlexpr
es im Allgemeinen flexibler ist.quelle
Hier ist, was ich verwendet habe, um
.edge
Dateien umzubenennen.blade.php
Funktioniert wie Charme.
quelle
Sie können eine Funktion auch in Bash erstellen, sie hinzufügen
.bashrc
oder so und sie dann verwenden, wo immer Sie möchten.Verwendungszweck:
Quelle des Codes in der Funktion: https://stackoverflow.com/a/1224786/6732111
quelle
Benennen Sie die Dateierweiterungen für alle Dateien im aktuellen Verzeichnis und in den Unterverzeichnissen ohne andere Pakete um (verwenden Sie nur das Shell-Skript):
Erstellen Sie ein Shell-Skript
rename.sh
im aktuellen Verzeichnis mit dem folgenden Code:Führen Sie es durch
./rename.sh .old .new
.Z.B.
./rename.sh .html .txt
quelle