Я збираюся розмістити ще два рішення з надією, що вони можуть бути корисними в майбутньому. Вони надійшли від адміністраторів Linux на роботі. Просто іде показати, скільки молотків буде працювати на цьому цвяху!
Рішення 1:
Привіт Денхем,
Мені тут доводиться робити кілька припущень, наприклад, що частина каталогу з "XXX # сезону" завжди буде директорією "зовні" (вузол листів).
У будь-якому випадку я написав би маленький сценарій. Щось подібне повинно спрацювати (зверніть увагу на подвійні лапки навколо змінних, щоб забезпечити захоплення всіх пробілів у каталогах):
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
Звичайно, перш ніж запустити його командою "mv" $ {olddir} "" $ {newdir} "", слід поставити щось на зразок "echo" $ {olddir} "" $ {newdir} "", щоб переконатися, що ти отримання очікуваних результатів або у вас може виникнути інший головний біль :-P
Рішення 2:
Привіт Денхем,
Більшість відповідей було вже в питанні. У будь-якому випадку із папки Серія працює щось на зразок наступного:
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
Пояснення:
• знайдіть -mindepth 2 -maxdepth 2 -тип d (перерахуйте каталоги на два рівні вниз)
• під час читання dir; (цикл на кожен dir)
• mv -T "$ dir" (перемістіть джерело dir до ... -T потрібно, щоб отримати помилку, якщо папки сезону не унікальні, тобто у вас немає "Теорія великого вибуху" 22 "та" Сезон 22 "у тому самому каталозі)
• ім'я" $ dir "повертає шлях, де знаходиться dir
• базове ім'я" $ dir "повертає ім'я каталогу
• sed" s /. Season ([0-9] ) $ / Сезон \ 1 / i "завершує магію з нечутливим випадком повторного виведення, про всяк випадок.
У моєму маленькому тесті це спрацювало (спробуйте спочатку з відлунням перед 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