
Ich möchte mehrere Dateien im selben Verzeichnis mithilfe von Bash-Skripten umbenennen. Die Namen der Dateien lauten wie folgt:
file2602201409853.p
file0901201437404.p
file0901201438761.p
file1003201410069.p
file2602201410180.p
Ich möchte in das folgende Format umbenennen:
file2503201409853.p
file2503201437404.p
file2503201438761.p
file2503201410069.p
file2503201410180.p
Ich habe über den Befehl zum Umbenennen gelesen und versuche, ihn auf diese Weise auszuführen, aber es passiert nichts. Ich glaube, ich habe Fragen zur Syntax. Dann habe ich gelesen, dass Sie eine Schleife erstellen können, indem Siemvden Befehl wie folgt:
for file in cmpsms*2014*.p; do
mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done
Ich kann die Dateien aber nicht umbenennen. Was mache ich falsch?
Antwort1
Sie hatten Recht, zuerst über das Umbenennen nachzudenken. Die Syntax ist ein wenig seltsam, wenn Sie nicht an reguläre Ausdrücke gewöhnt sind, aber es ist bei weitem der schnellste/kürzeste Weg, wenn Sie wissen, was Sie tun:
rename 's/\d{4}/2503/' file*
Dabei werden einfach die ersten 4 Zahlen abgeglichen und gegen die von Ihnen angegebenen ausgetauscht.
Und ein Test-Harness ( -vn
bedeutet ausführlich sein, aber nichtTunalles) unter Verwendung Ihrer Dateinamen:
$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p
Antwort2
Das hier sollte funktionieren:
for f in file*; do mv $f ${f/${f:4:8}/25032014}; done
Es ersetzt die Zeichenfolge zwischen dem 4. und 12. Zeichen durch „25032014“.
Antwort3
dies ist eigentlich die Antwort von @Eric von oben – aber es ist eine elegante Antwort, deshalb poste ich sie noch einmal als richtige Antwort, um mehr Aufmerksamkeit darauf zu lenken.
for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done
Antwort4
Eine einfache native Möglichkeit, dies ohne Schleife zu tun, mitVerzeichnisdurchquerung:
find -type f | xargs -I {} mv {} {}.txt
Es werden alle vorhandenen Dateien umbenannt.
Und unten ein funktionierendes Beispiel mitParallelisierung:
find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'