Ä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?

Amal Antony
quelle
14
imho das ist keine doppelte frage - die andere
frage

Antworten:

202

Wenn Sie eine Umbenennung zur Verfügung haben, verwenden Sie:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

oder aber:

find . -name '*.t1' -exec rename .t1 .t2 {} +

Wenn das Umbenennen nicht verfügbar ist, verwenden Sie:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +
Anubhava
quelle
20
find . -name '*.t1' -exec rename .t1 .t2 {} +
Aaron Blenkush
2
(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 
chepner
quelle
7

Oder Sie können den mmvBefehl einfach installieren und Folgendes tun:

mmv '*.t1' '#1.t2'

Hier #1ist der erste Glob-Teil, dh der *in *.t1.

Oder in reinem Bash-Zeug wäre ein einfacher Weg:

for f in *.t1; do
    mv "$f" "${i%.t1}.t2"
done

(dh: forkann Dateien ohne die Hilfe eines externen Befehls wie lsoder auflisten find)

HTH

zmo
quelle
7
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
jrjc
quelle
8
Analysieren Sie nicht ls und sehen Sie auf derselben Seite, warum Ihre findSyntax schlecht ist.
Monica wieder herstellen Bitte
2
Danke, ich wusste es nicht.
jrjc