Benennen Sie mehrere Dateien mithilfe von Bash-Skripten um

Benennen Sie mehrere Dateien mithilfe von Bash-Skripten um

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 ( -vnbedeutet 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}'

verwandte Informationen