Вы пропускаете опцию 5: запишите сценарий обертки, который перенаправляет вывод sync_members
и проверки, является ли это "Ничем, чтобы сделать"..
С надлежащей проверкой кода выхода это могло сделать задание вполне прилично. Это - относительно безопасное обновление - пока "ничто" не обменивается сообщениями, не изменяется, Ваш сценарий не должен сохраняться.
И можно решить, как обработать ошибочные случаи в том сценарии (т.е. просто cat
файл журнала, или делают что-то более интересное).
На Debian и производных (включая Ubuntu):
find /media/Expansion2/Series/ -type d -exec rename -n 's/.*(Season \d)/$1/' {} ";"
rename
команда является частью пакета Perl. Это не обеспечивается другими дистрибутивами, они вместо этого предоставляют стандартный Linux rename
команда, которая не полезна здесь.
Если rename -n
(-не действительно), отображает то, что это хочет сделать, и это в порядке для Вас, опустите-n и заставьте его произойти.
Следующий отрывок разделяет что-либо, что происходит перед последним вхождением Season [0-9]
в каждом выставочном каталоге под /media/Expansion2/Series
. Никакие необходимые регулярные выражения, просто шарики.
cd /media/Expansion2/Series
for show in ./*/; do
(
cd "$show" || { echo "cd failed. Skipping $show"; exit 1; }
for season in ./*Season\ [[:digit:]]*/; do
season_prefix=${season%Season [[:digit:]]*}
mv "$season" ./"${season#$season_prefix}"
done
)
done
Если Вы предпочитаете избегать рискованных действий и только переименовывать some show/some show stuff
кому: some show/stuff
:
for d in */; do
for f in "$d${d%/} *"; do
mv "$f" "${d}${f%$d${d%/} }"
done
done
Если Вы хотите разделить все прежде Season
:
for x in */*Season*; do
mv "$x" "${x%/*}/${x##*Season}Season"
done
${var#PATTERN}
ШАБЛОН полос в начале $var
и возвращает результат. ${var%PATTERN}
делает то же в конце. ${var#PATTERN}
и ${var%PATTERN}
удалите самый короткий префикс соответствия и суффикс соответственно; ${var##PATTERN}
и ${var%%PATTERN}
удалите самое долгое соответствие.
Я собираюсь отправить еще два решения в надежде, что они могут быть полезными в будущем. Они прибыли от администраторов Linux в работу. Просто идет для показа, сколько молотков будет работать над этим гвоздем!
Привет Denham,
Я должен сделать несколько предположений здесь, например, что часть каталога с "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}"", необходимо поместить что-то как "эхо "$ {olddir}" "$ {newdir}"", чтобы гарантировать, что Вы получаете результаты, которые Вы ожидаете, или Вы могли закончить с другой головной болью :-P
Привет Denham,
Большая часть ответа уже была в вопросе. Так или иначе выполнение чего-то как следование из папки 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
Объяснение:
• найдите-mindepth 2-maxdepth 2 - тип d (каталоги списка два уравнивает),
• в то время как считанный dir; (цикл на каждом dir)
• mv-T "$dir" (перемещают исходный dir в...-T, необходим для получения ошибки, если папки Season не уникальны, т.е. у Вас нет "Сезона Теории "большого взрыва" 22" и "Сезона 22" в том же каталоге),
• dirname "$dir" возвращает путь, где dir
• базовое имя "$dir" возвращает название каталога
• sed "s/.Season ([0-9]) $ / Сезон \1/i" завершает волшебство с нечувствительным к регистру regexp на всякий случай.В моем маленьком тесте это работало (попробуйте его сначала эхом прежде 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 3someuser@linux-box:/tmp/Series$ находят-mindepth 2-maxdepth 2 - тип d | в то время как считанный dir; сделайте mv-T "$dir""
dirname "$dir"
/basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"
";готово
mv:./The Big Bang Theory/Season 2' and
./The Теория/Сезон 2 большого взрыва' является тем же файлом
mv:./Other Series/Season 2' and
./Other Ряды/Сезоны 2' являются тем же файломsomeuser@linux-box:/tmp/Series$ находят
.
./The Теория "большого взрыва"
./The Теория/Сезон 2 большого взрыва
./The Теория/Сезон большого взрыва 2/file1.avi
./The Теория/сезон 2/файла 3.avi большого взрыва
./The Теория/Сезон большого взрыва 2/file2.avi
./The Теория/Сезон 2/файла большого взрыва
./The Теория/Сезон большого взрыва 2/3.avi
./The Теория/Сезон 1 большого взрыва
./The Теория/Сезон большого взрыва 1/file1.avi
./The Теория/сезон 1/файл 3.avi большого взрыва
./The Теория/Сезон большого взрыва 1/file2.avi
./The Теория/Сезон 1/файл большого взрыва
./The Теория/Сезон большого взрыва 1/3.avi
./Other Ряд
./Other Ряд/Сезон 3
./Other Ряд/Сезон 2
rename
на Debian только. На Ubuntu (и некоторые разновидности), для предотвращения, имя сталкивается с ранее упомянутым стандартомrename
команда, это иногда (но не всегда) найдено подprename
. Здесь на Lubuntu, сам инструмент называютprename
но это можно назвать какrename
из-за цепочки символьной ссылки/usr/bin/rename -> /etc/alternatives/rename -> /usr/bin/file-rename
, гдеfile-rename
немного измененная версияprename
. – syntaxerror 14.11.2014, 05:01