Ich möchte eine Dateierweiterung von *.txt
in ändern *.text
. Ich habe versucht, den basename
Befehl zu verwenden, aber ich habe Probleme, mehr als eine Datei zu ändern.
Hier ist mein Code:
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
Ich erhalte diesen Fehler:
basename: too many arguments Try basename --help' for more information
bash
shell-script
rename
afbr1201
quelle
quelle
Antworten:
Direkt aus Gregs Wiki :
Lesen Sie auch den Eintrag, warum Sie nicht analysieren sollten
ls
.Bearbeiten: Wenn Sie
basename
Ihre Syntax verwenden müssen, wäre:quelle
*.txt
Syntax) , den bloßen Doppelstrich--
und die Verwendung des%${}
-Symbols innerhalb des Konstrukts . Bis jetzt war ich den beiden letzteren noch nie begegnet und hatte nicht gewusst, was mit den ersteren wirklich geschah.for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
So ändere ich alle Dateierweiterungen im aktuellen Verzeichnis von Debian.
(Dies ist der Perl-
rename
Befehl, nicht derutil-linux
eine. Siehe Warum unterscheidet sich das Umbenennungsdienstprogramm unter Debian / Ubuntu von dem auf anderen Distributionen wie CentOS? )quelle
brew install rename
ich das zum Laufen bringen.rename "s/oldExtension/newExtension/" **.txt
alle * .txt rekursiv umbenennenfootxt.txt
. Verwenden Sie stattdessen: unix.stackexchange.com/questions/19654/…rename 's/$/.txt/' *
Ein einfacher Befehl, der
rename
fromutil-linux
, erledigt das für Sie und ersetzt alle Vorkommen von "txt" zu "text" in allen Dateien, die mit "* .txt" übereinstimmen:quelle
rename
Ändert das erste Vorkommen, also mach das besserrename .txt .text
, aber das funktioniert immer noch nicht (zB umbenennenfoo.txtx.bar.txt
infoo.textx.bar.txt
).rename
Befehl tatsächlichperl-rename
und verwendet Perl-Regexes. Dafür würde der entsprechende Befehl sein:rename 's/.txt/.text/' *.txt
. Die Leute sollten dasman rename
auf ihrem System überprüfen , um herauszufinden, welches sie haben.Oben funktioniert gut, ist aber auf das aktuelle Verzeichnis beschränkt. Probieren Sie den folgenden Befehl aus, der für Unterverzeichnisse flexibel ist. Alle
.txt
Dateien in der Verzeichnisstruktur werden mit einer neuen Erweiterung umbenannt.quelle
rename
Kann mehrere Dateien als Argument behandeln, können Sie die Dinge erheblich beschleunigen, indem Sie verwenden,+
anstatt\;
wenn es viele solcher Dateien gibtfootxt.txt
. Verwenden Sie stattdessen: unix.stackexchange.com/questions/19654/…quelle
Die hier angegebenen Antworten
s/oldExtension/newExtension/
sind falsch. Wenn Sie verwendens/txt/text/
, würde konvertieren Siefootxt.txt
zufootext.txt
, das ist nicht das, was Sie wollen. Auch wenn Sie verwendens/.txt/.text/
, das wäre konvertierenfootxt.txt
zufo.text.txt
.Sie müssen verwenden
\.
, um den Punkt abzugleichen (entspricht einem.
beliebigen Zeichen). Und das abschließende$
, um das Ende der Linie zu entsprechen. Nur so wird die Erweiterung richtig zugeordnet.quelle
Basierend auf der Antwort von @Prince John Wesley finden Sie hier ein einfaches Bash-Skript zum Ändern aller Dateierweiterungen im aktuellen Verzeichnis von
ext1
nachext2
. Gibt auch die Namen der Dateien aus, die umbenannt werden.Beispielverwendung (unter der Annahme, dass der Name des Skripts lautet
change-ext
):quelle
for...
) durch zwei Zeilen:shopt -s globstar
undfor f in **/*.$1
. Benötigt Bash 4+.Grund # 53, zu zsh zu wechseln:
zmv '(*).txt' '$1.text'
quelle
Nehmen wir an, Ihre Dateien befinden sich in verschiedenen Verzeichnissen. Angenommen, dirx ist Ihr übergeordnetes Verzeichnis, dann erledigen Sie dies mit find:
quelle
Das funktioniert bei mir:
quelle
Wenn du
und Zielerweiterung ist .text Sie würde es auf diese Weise tun -
quelle
for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
Für den Fall, dass Sie wissen möchten, was in Ihrer Version schief gelaufen ist: Sie haben
$files
anstelle des$x
Befehls basename verwendet. Das sollte also funktionieren (ungetestet):quelle