Ich möchte rekursiv durch ein Verzeichnis iterieren und die Erweiterung aller Dateien einer bestimmten Erweiterung ändern, sagen wir .t1
zu .t2
. Was ist der Bash-Befehl dafür?
Ich möchte rekursiv durch ein Verzeichnis iterieren und die Erweiterung aller Dateien einer bestimmten Erweiterung ändern, sagen wir .t1
zu .t2
. Was ist der Bash-Befehl dafür?
Antworten:
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' - '{}' +
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 vermeiden
Oder Sie können den mmv
Befehl einfach installieren und Folgendes tun:
mmv '*.t1' '#1.t2'
Hier #1
ist 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: for
kann Dateien ohne die Hilfe eines externen Befehls wie ls
oder auflisten find
)
HTH
*
in*.t1
$ mmv -n ';*.t1' '#1#2.t2'
. Entfernen Sie das -n
Flag, um es auszuführen
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