Bash-Skript zum Korrigieren von Dateinamen

Bash-Skript zum Korrigieren von Dateinamen

Ich habe Hunderte von Ordnern mit Tausenden von Unterverzeichnissen und Dateien darin. Die Dateinamen haben derzeit das Format

sf{number}-{number} - {text}

und ich muss alles löschen, bis {text}.

Beispiel:

sf012-05 - toto - africa.cdg 
sf012-05 - toto - africa.mp3

->

toto - africa.cdg
toto - africa.mp3

Zusätzliche Formate:

SF-108 - 02 Johnny Hates Jazz Shattered Dreams[K].cdg
02 - David Essex - Rock On.cdg
SF0504 - 13 Walker Brothers, The  Make It Easy On Yourself.cdg
SFLY 051 - 07 America  A Horse With No Name.cdg
SF217-12 this love - maroon 5.cdg
SF262-13. Same Mistake - James Blunt.cdg
SF287 - 13 Luke Bryan Do I.cdg
SF355-01-15 - Tough Love - Pony.cdg
Track 11 Livin' La Vida Loca (Radio Edit) - Martin, Ricky.cdg
Sunfly Hits 275 - 07 SF275-7-Right Now (Na Na Na)-Akon.mp3
Second, Minute Or Hour - Jack Penate.mp3
SF057 - Karaoke Classics Vol.57 - 03 Abba Thank You For The Music.cdg

vor allem das letzte ist totaler Mist.

Das bedeutet, dass ich ein rekursives Regex-Bash-Skript oder etwas Ähnliches brauche, um diese Dateien durchzugehen und umzubenennen.

Antwort1

Wenn Sie über das Perl-basierte renameDienstprogramm verfügen (das prenamebei einigen Distributionen aufgerufen wird), können Sie mithilfe eines regulären Ausdrucks alle Dateien auf einmal umbenennen.

Ihre Anforderung verlangt die Entfernung von , sf{number}-{number}aber alle Beispiele beginnen mit Großbuchstaben, einige enthalten nur ein {number}, {number}-{number}-{number}, oder sogar {number}{space}-{space}{number}. Ich gehe davon aus, dass Sie die ersten beiden dieser Fälle einschließen möchten.

rename -n 's/^sf[0-9-]+\s+(-\s+)?//' [Ss][Ff]*

Entfernen Sie es, -nwenn Sie bereit sind, die Änderungen anzuwenden, oder ändern Sie es in , -vum zu sehen, wie die Dateien während der Verarbeitung verarbeitet werden.

Antwort2

Das einfachste Mittel hierfür wärezsh(wie Bash, nur besser), mit seinemausgefallenes Globbingund daszmvFunktion. Führen Sie dies aus dem obersten Verzeichnis aus, in dem Sie die Dateien umbenennen möchten.

autoload -U zmv
zmv '(**/)[Ss][Ff][0-9]##-[0-9]##[- ]#(*)' '$1$2'

Erklärung: **/ist eine beliebige Zeichenfolge mit führenden Verzeichnissen. Dann folgt ein Muster aus sf(ohne Berücksichtigung der Groß-/Kleinschreibung), gefolgt von einer oder mehreren Ziffern, einem Bindestrich und einer weiteren Zahl, gefolgt von Bindestrichen und Leerzeichen. Schließlich kann ein beliebiges Suffix folgen *. Die Zahlen im Ersatz beziehen sich auf die eingeklammerten Gruppen im Muster.


Alternativ können Sie verwenden prename(das Perl-basierte Umbenennungsskript, das unter Debian und Arch Linux verfügbar ist, muss unter Umständen auf anderen Distributionen separat installiert werden). Sie müssen es mit kombinieren, findum die Liste der umzubenennenden Dateien zu erhalten. Es spielt keine Rolle, ob renamenicht übereinstimmende Dateien übergeben werden, es überspringt Dateien, die nicht umbenannt werden müssen.

find -name '[Ss][Ff]*' -exec prename 's!/!sf[0-9]+-[0-9]+[- ]*!!i' {} +

Antwort3

Hier ist der Code (ersetzen Sie „Verzeichnis“ durch das Hauptverzeichnis oder das Verzeichnis, in dem sich die Unterverzeichnisse befinden):

cd directory
find -type f | while IFS= read - file; do 
    name=$(echo "$file"  | rev | cut -d'/' -f1 | rev |  cut -d'-' -f3- | cut -d' ' -f2-) 
    path=$(dirname "$file")  
    newname="${path}/${name}"
    echo mv "$file" "$newname" 
done

Dabei ist das Verzeichnis das Hauptverzeichnis, in dem sich alle Unterverzeichnisse befinden.

Bitte entfernen Sie das „Echo“ nicht aus „mv“, sondern testen Sie es zuerst.

Achten Sie darauf, es nicht im falschen Verzeichnis auszuführen, das kann sehr gefährlich sein.

Antwort4

Du sagst dumuss alles gelöscht werden bis {text}, aber Ihr Beispiel zeigt das nicht. Anstatt den genauen Code anzuzeigen, möchte ich nur einen Plan vorschlagen.

1) Schreiben Sie ein Skript, das das tut, was Sie wolleneinsDateiname. So etwas könnte genügen:

#! /bin/sh
test -d ~/OK/${PWD} || mkdir -p ~/OK/${PWD}
ln "$1" "~/OK/${PWD}/$1"
echo "$1" | awk -F ' - ' '{print $NF}'

Dadurch wird der Name nach dem Muster „-“ umgebrochen und das letzte Feld gedruckt. Außerdem wird der ursprüngliche Dateiname gespeichert, sodass Sie ihn abrufen können, wenn etwas schief geht. Testen Sie es ein paar Mal und verwenden Sie es, mvum die Namen wiederherzustellen.

2) Rufen Sie Ihr Skript auf mitfinden:

$ find dirname -exec script.awk {} +

Dadurch wird Ihr Computer mit vielen parallelen Aufrufen Ihres Skripts überlastet. Wenn dies erledigt ist, müssen Sie eine Reihe OK-Verzeichnisse entfernen und wissen, wie Sie diese mit „find“ entfernen.

verwandte Informationen