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


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' - '{}' +

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 

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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.