Zahlen und Bindestriche rekursiv aus Dateinamen entfernen

7

Ich ändere ein einfaches BASH-Skript, um Zahlen und Bindestriche vom Anfang meiner MP3-Dateien zu entfernen. Ziel ist es, Dateien umzubenennen wie:

  • 11 Song 1.mp3
  • 1-1-Song 2.mp3
  • 11-1 Song 3.mp3

zu:

  • Song 1.mp3
  • Song 2.mp3
  • Song 3.mp3

Ich habe dieses Skript, das für alle Dateien im aktuellen Verzeichnis funktioniert

$ for f in [0-9]*; do mv "$f" "`echo $f | sed 's/^[0-9]*\W*//'`"; done

und haben es geändert, um nach allen Dateien in Unterordnern zu suchen:

#!/bin/bash

dir=''

IFS='
'
for f in $(find $dir * -type f) ; do
  mv "$f" "`echo $f | sed 's/^[0-9]*\W*//'`"; 
done

Das Problem ist, dass der $fWert den Unterordner und den Dateinamen zurückgibt und die mvZeile nach Dateien sucht, die mit [0-9] beginnen. Daher werden alle Dateien in einem Unterordner nicht umbenannt.

ZB Die Datei mp3/1-1 Song 1.mp3beginnt mp3/, beginnt nicht mit einer Zahl, daher wird sie nicht umbenannt.

Gibt es eine Möglichkeit, die Verzeichnis- und Dateiwerte in separate Variablen zu lesen, oder gibt es eine bessere Möglichkeit, dies zu tun?

Vielen Dank

Stephen Provis
quelle

Antworten:

4

find & sed: Ich würde Sie bitten, zuerst die Pipe und sh am Ende zu entfernen und zu prüfen, ob der Befehl mv ordnungsgemäß generiert wird. Anschließend können Sie den Befehl als solchen ausführen:

find $dir -type f | sed 's|\(.*/\)[^A-Z]*\([A-Z].*\)|mv \"&\" \"\1\2\"|' | sh
Guru
quelle
Schöne Lösung! Beachten Sie, dass dies die Frage geringfügig ändert, indem alles vor dem ersten Großbuchstaben im Dateinamen entfernt wird (anstatt nur Ziffern und Bindestriche). Wenn dies wünschenswert ist, möchten Sie wahrscheinlich zumindest beide A-ZInstanzen ändern , A-Za-zfalls Titel keine Großbuchstaben enthalten.
Glibdud
2

Es ist kein Skript erforderlich, dafür gibt es einen Einzeiler.

Versuchen Sie dies, um zu sehen, was es tut (keine Sorge, dies benennt Ihre Dateien noch nicht um, siehe unten):

find root_audio_path -type f -iname '*mp3' -execdir rename --no-act 's/^\.\/[\d\s\-]+/\.\//' '{}' ';'

Entfernen Sie, --no-actwenn es zu funktionieren scheint. Dadurch werden die Dateien tatsächlich umbenannt .

Die -execdirOption findstellt sicher, dass diese renameim Dateiverzeichnis ausgeführt wird, sodass die Dateipfade immer mit beginnen ./- nach denen wir suchen rename.

rename In Ubuntu werden Perls tatsächlich umbenannt, sodass Sie dort reguläre Ausdrücke verwenden können.

Phoibos
quelle
Dies scheint zu funktionieren, geht aber nicht über den übergeordneten Ordner hinaus, in dem das Problem auftritt.
Stephen Provis
Es funktioniert auch für eine beliebige Anzahl von Unterordnern. Die Ausgabe, die Sie sehen, ist die von rename, die in jedem Verzeichnis ausgeführt wird. Weil es immer ein Arbeitsverzeichnis ist ./, ist das alles, was Sie sehen. Die Dateien werden jedoch in allen Unterverzeichnissen umbenannt.
Phoibos
0

Das Folgende gibt Ihnen den Weg

echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)\(.*\)#\1#g'
/wwww/www/mp3/

Mit dem folgenden Befehl erhalten Sie die Datei ohne Pfad:

echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)##g'
1-1 Song 1.mp3

Sie benötigen eine Variable für den Pfad, alte und neue Dateinamen. Sie können den neuen Dateinamen mithilfe Ihres Codes abrufen und mithilfe dieser Variablen einen Quell- und Zielpfad erstellen. Ich würde empfehlen, einen Probelauf durchzuführen, bei dem Sie das an eine Datei angehängte Ziel wiederholen. Dann können Sie nach d suchen

Romski
quelle