Ich werde zwei weitere Lösungen veröffentlichen, in der Hoffnung, dass sie in Zukunft hilfreich sein können. Diese kamen von den Linux-Administratoren bei der Arbeit. Nur um zu zeigen, wie viele Hämmer an diesem Nagel arbeiten werden!
Lösung 1:
Hallo Denham,
Ich muss hier einige Annahmen treffen, zum Beispiel, dass der Teil des Verzeichnisses mit "XXX Season #" immer das "externe" Verzeichnis (Blattknoten) sein wird.
Auf jeden Fall würde ich ein kleines Skript schreiben. So etwas sollte funktionieren (beachten Sie die doppelten Anführungszeichen um die Variablen, um sicherzustellen, dass Sie alle Leerzeichen in den Verzeichnissen erfassen):
find /media/Expansion2/Series/ -type d | while read olddir
do
newdir=`echo "${olddir}" | awk -F "/" '$NF ~ /Season/ { last=substr($NF,index($NF, "Season")); while (i<(NF-1)) { i++; printf("/%s", $i) }; printf("/%s\n", last) } $NF !~ /Season/ { print }'`
if [ "${olddir}" != "${newdir}" ]
then
mv "${olddir}" "${newdir}"
fi
done
Bevor Sie es mit dem Befehl "mv" $ {olddir} "" $ {newdir} "" ausführen, sollten Sie natürlich etwas wie "echo" $ {olddir} "" $ {newdir} "" einfügen, um sicherzustellen, dass Sie es sind Erhalten Sie die Ergebnisse, die Sie erwarten, oder Sie könnten andere Kopfschmerzen bekommen :-P
Lösung 2:
Hallo Denham,
Die meiste Antwort war bereits in der Frage. Auf jeden Fall sollte das Ausführen von Folgendem aus dem Serienordner einwandfrei funktionieren:
find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "`dirname "$dir"`/`basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"`"; done
Erläuterung:
• find -mindepth 2 -maxdepth 2 -type d (Listenverzeichnisse zwei Ebenen tiefer)
• while read dir; (Schleife in jedem Verzeichnis)
• mv -T "$ dir" (Verschieben Sie das Quellverzeichnis nach ... -T wird benötigt, um einen Fehler zu erhalten, wenn die Saisonordner nicht eindeutig sind, dh Sie haben nicht "The Big Bang Theory Season" 22 "und" Staffel 22 "im selben Verzeichnis)
• dirname" $ dir "gibt den Pfad zurück, in dem sich
das Verzeichnis befindet. • Basisname" $ dir "gibt den Namen des Verzeichnisses zurück.
• sed" s /. Season ([0-9] ) $ / Season \ 1 / i "vervollständigt die Magie mit regulärem Groß- und Kleinschreibung, nur für alle Fälle.
In meinem kleinen Test hat es funktioniert (versuchen Sie es zuerst mit einem Echo vor mv):
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/The Big Bang Theory Season 1
./The Big Bang Theory/The Big Bang Theory Season 1/file1.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file 3.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file2.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file
./The Big Bang Theory/The Big Bang Theory Season 1/3.avi
./Other Series
./Other Series/Season 2
./Other Series/Stre dsfdf sd dSeason 3
someuser@linux-box:/tmp/Series$ find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "dirname "$dir"
/basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"
"; done
mv: ./The Big Bang Theory/Season 2' and
./The Big Bang Theory/Season 2' are the same file
mv: ./Other Series/Season 2' and
./Other Series/Season 2' are the same file
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/Season 1
./The Big Bang Theory/Season 1/file1.avi
./The Big Bang Theory/Season 1/file 3.avi
./The Big Bang Theory/Season 1/file2.avi
./The Big Bang Theory/Season 1/file
./The Big Bang Theory/Season 1/3.avi
./Other Series
./Other Series/Season 3
./Other Series/Season 2