Ändern Sie die Dateierweiterungen in Bash rekursiv
85
Ich möchte rekursiv durch ein Verzeichnis iterieren und die Erweiterung aller Dateien einer bestimmten Erweiterung ändern, sagen wir .t1zu .t2. Was ist der Bash-Befehl dafür?
(Meine Version von renameerlaubt nicht den Ersetzungsausdruck im sed-Stil. Ich muss Linux lieben. Früher musste ich TotalCommander für Windows installieren, um solche Dinge zu tun.)
Aaron Blenkush
6
Falls sich jemand fragt, was der "${1%.t1}".t2Teil tut, wie ich es getan habe: Er verwendet die Bash-String-Manipulation, um Folgendes zu tun: 1 / Nehmen Sie den ersten Positionsparameter $1und schneiden Sie das .t1String-Literal von seinem Ende ab (Prozentzeichenoperator %). 2 / Fügen Sie das .t2String-Literal an das Ergebnis an.
Zack
2
Die Umbenennung hat in OSX bei mir nicht funktioniert, aber die Bash-Version ist fantastisch. Ich habe gerade 'git' vor mv hinzugefügt und jetzt ist git glücklich :-D
bdombro
2
lieber Benutzer find . -type f -name '*.t1', um Ordner zu vermeiden
Golak Sarangi
8
Wenn Ihre Version von bashdie globstarOption unterstützt (Version 4 oder höher):
shopt -s globstar
for f in**/*.t1;do
mv "$f""${f%.t1}.t2"done
Ich gehe davon aus, dass sich die Verwendung von "rekursiv" durch das OP auch auf das Umbenennen von Dateien in Unterverzeichnissen des Verzeichnisses bezieht.
Chepner
Sorry, aber was bedeutet # 1?
Inafalcao
1
es ist der erste glob Teil dh die *in*.t1
ZMO
rekursiv : $ mmv -n ';*.t1' '#1#2.t2'. Entfernen Sie das -nFlag, um es auszuführen
okliv
4
Ich würde dies in Bash so machen:
for i in $(ls *.t1);do
mv "$i""${i%.t1}.t2"done
EDIT: mein Fehler: es ist nicht rekursiv, hier ist mein Weg für die rekursive Änderung des Dateinamens:
for i in $(find `pwd`-name "*.t1");do
mv "$i""${i%.t1}.t2"done
Antworten:
Wenn Sie eine Umbenennung zur Verfügung haben, verwenden Sie:
oder aber:
Wenn das Umbenennen nicht verfügbar ist, verwenden Sie:
quelle
find . -name '*.t1' -exec rename .t1 .t2 {} +
rename
erlaubt nicht den Ersetzungsausdruck im sed-Stil. Ich muss Linux lieben. Früher musste ich TotalCommander für Windows installieren, um solche Dinge zu tun.)"${1%.t1}".t2
Teil tut, wie ich es getan habe: Er verwendet die Bash-String-Manipulation, um Folgendes zu tun: 1 / Nehmen Sie den ersten Positionsparameter$1
und schneiden Sie das.t1
String-Literal von seinem Ende ab (Prozentzeichenoperator%
). 2 / Fügen Sie das.t2
String-Literal an das Ergebnis an.find . -type f -name '*.t1'
, um Ordner zu vermeidenWenn Ihre Version von
bash
dieglobstar
Option unterstützt (Version 4 oder höher):quelle
Oder Sie können den
mmv
Befehl einfach installieren und Folgendes tun:Hier
#1
ist der erste Glob-Teil, dh der*
in*.t1
.Oder in reinem Bash-Zeug wäre ein einfacher Weg:
(dh:
for
kann Dateien ohne die Hilfe eines externen Befehls wiels
oder auflistenfind
)HTH
quelle
*
in*.t1
$ mmv -n ';*.t1' '#1#2.t2'
. Entfernen Sie das-n
Flag, um es auszuführenIch würde dies in Bash so machen:
EDIT: mein Fehler: es ist nicht rekursiv, hier ist mein Weg für die rekursive Änderung des Dateinamens:
quelle
find
Syntax schlecht ist.