Я собираюсь опубликовать еще два решения в надежде, что они могут быть полезны в будущем. Они пришли от администраторов Linux на работе. Просто идет, чтобы показать, сколько молотков будет работать на этом гвозде!
Решение 1:
Привет Денхем,
Здесь я должен сделать несколько предположений, например, что часть каталога с «XXX Season #» всегда будет «внешним» каталогом (конечным узлом).
В любом случае я бы написал небольшой сценарий. Примерно так должно работать (обратите внимание на двойные кавычки вокруг переменных, чтобы убедиться, что вы захватили все пробелы в каталогах):
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:
Привет Денхем,
Большая часть ответа уже была в вопросе. В любом случае, выполнение чего-то вроде следующего из папки 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
Объяснение:
• find -mindepth 2 -maxdepth 2 -type d (список каталогов на два уровня ниже)
• во время чтения dir; (цикл для каждого каталога)
• mv -T «$ dir» (переместить исходный каталог в ... -T необходимо, чтобы получить ошибку, если папки Season не уникальны, т.е. у вас нет «Season Theory Theory Season» 22 "и" Season 22 "в том же каталоге)
• dirname" $ dir "возвращает путь к каталогу dir
• базовое имя" $ dir "возвращает имя каталога
• sed" s /. Season ([0-9] ) $ / Season \ 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