Linux Bulk benennt Mediendateien und Verzeichnisse um, um das Jahr am Ende des Dateinamens und des Verzeichnisnamens in Klammern zu setzen

438
Peter Freeman

Ich habe eine Reihe von Heimvideodateien in verschiedenen Verzeichnissen, die ein Jahr am Ende des Verzeichnisnamens haben, um das Jahr anzugeben, in dem das Video gedreht wurde. Es ist auch am Ende der Dateinamen in diesem Verzeichnis und vor der Erweiterung. Ich möchte das ganze Jahr in Klammern setzen.

Einige Dateien und Verzeichnisse haben möglicherweise auch ein Jahr (oder Zahlen, die wie ein Jahr aussehen) im Dateinamen in anderen Positionen, aber ich möchte am Ende nur das Jahr mit Klammern versehen. Zum Beispiel ist hier eines der Verzeichnisse:

Videos/Xmas 2004 - Time To Go 2004 

enthält:

Xmas 2004 - Time To To 2004.mp4  Xmas 2004 - Time To Go 2004.txt  Xmas 2004 - Time To Go 2004.readme  

Ich möchte alle meine Mediendateien umbenennen, um dieses Namenssystem zu erhalten:

Videos/Xmas 2004 - Time To Go (2004) 

enthält

Xmas 2004 - Time To To (2004).mp4  Xmas 2004 - Time To Go (2004).txt  Xmas 2004 - Time To Go (2004).readme 

Wie mache ich das? Ich kann den Befehl "find" verwenden, um die Dateien und Verzeichnisse abzurufen:

find /home/user/Videos/ -iname "* [1-2][0-9][0-9][0-9]" # Find directories find /home/user/Videos/ -iname "* [1-2][0-9][0-9][0-9].*" # Find files 

Ich frage mich, wie ich die "-exec {} \;" verwenden kann. Struktur, um den Befehl umbenennen oder mv (oder sed oder awk) zu verwenden, oder schreibe ich ein Bash-Skript, um den Dateinamenstring zu ändern, und füge das in "-exec {} \;"

0

1 Antwort auf die Frage

0
pii_ke

Dieses Skript gibt die erforderlichen mvBefehle an stdout. Sie sollten sie in einer Datei ( sh script > file) speichern und untersuchen. Wenn Sie die Ausführung als sicher empfinden, können Sie die Befehle in file ( sh file) ausführen . Oder Sie können sich ändern, printum systemin dem selbst - Skript.

find $1 -type f > /tmp/to_rename find $1 -type d >> /tmp/to_rename perl -lne ' $re = qr/([12]\d\d\d)(\.\w*)?$/; if (/$re/) { $old = $_; s/$re/(\1)\2/; print("mv \"$old\" \"$_\""); } ' /tmp/to_rename 
@PeterFreeman Wenn Sie die Antwort für akzeptabel halten, markieren Sie dies bitte. Prost. :) pii_ke vor 7 Jahren 0