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.

War es hilfreich?

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

  1. Installieren Umbenennungs wenn Sie nicht haben: brew install rename
  2. 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$ 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top