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?
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?
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 {} +
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.)
"${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.
find . -type f -name '*.t1', um Ordner zu vermeiden
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
*in*.t1
$ mmv -n ';*.t1' '#1#2.t2'. Entfernen Sie das -nFlag, 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