2014-02-24 23 views
42

Ich möchte rekursiv durch ein Verzeichnis iterieren und die Erweiterung aller Dateien einer bestimmten Erweiterung ändern, sagen .t1 zu .t2. Was ist der Bash-Befehl dafür?rekursiv Dateierweiterungen in Bash ändern

+6

imho das ist keine doppelte Frage - die andere Frage ist nicht rekursiv –

Antwort

102

Wenn Sie zur Verfügung haben umbenennen dann verwenden:

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

Wenn Umbenennungs nicht verfügbar ist, dann verwenden:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' \; 
+10

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

+2

(Meine Version von' rename' erlaubt den sed-Ausdruck nicht. Ich muss Linux lieben. Ich musste früher TotalCommander für Windows installieren mach sowas. –

+1

Bitte benutze eine Parametererweiterung anstelle eines hässlichen 'sed'! –

1

Ich würde in bash auf diese Weise tun:

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 rekursive Dateinamen ändern:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2" 
done 
+7

[Pars ls nicht analysieren] (http://mywiki.wooledge.org/ParsingLs), und sehen Sie die gleiche Seite für warum Ihre 'Find'-Syntax schlecht ist. Stellen Sie außerdem sicher, dass Sie [Ihre Variablen angeben] ( – BroSlow

+2

) Danke, ich wusste es nicht. – jrjc

6

Oder Sie können einfach installieren Sie den Befehl mmv und zu tun:

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

Hier #1 ist der erste Teil glob heißt die * in *.t1.

oder in reiner bash stuff, wäre eine einfache Art und Weise sein:

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

(dh: for können Dateien aufzulisten, ohne die Hilfe eines externen Kommandos wie ls oder find)

HTH

+4

Ich gehe davon aus, dass die Verwendung von "rekursiv" durch das OP auch das Umbenennen von Dateien in Unterverzeichnissen des Verzeichnisses betrifft. – chepner

+0

Sorry, aber was ist die Bedeutung von # 1? – inafalcao

+1

ist es der erste Globteil, d.h. das '*' in '* .t1' – zmo

7

Wenn Ihre Version von bash unterstützt die globstar Option (Version 4 oder höher):

shopt -s globstar 
for f in **/*.t1; do 
    mv "$f" "${f%.t1}.t2" 
done 
Verwandte Themen