Рекурсивно переименуйте подкаталоги, которые соответствуют regex

Вы пропускаете опцию 5: запишите сценарий обертки, который перенаправляет вывод sync_members и проверки, является ли это "Ничем, чтобы сделать"..

С надлежащей проверкой кода выхода это могло сделать задание вполне прилично. Это - относительно безопасное обновление - пока "ничто" не обменивается сообщениями, не изменяется, Ваш сценарий не должен сохраняться.

И можно решить, как обработать ошибочные случаи в том сценарии (т.е. просто cat файл журнала, или делают что-то более интересное).

10
28.04.2012, 02:09
4 ответа

На Debian и производных (включая Ubuntu):

find /media/Expansion2/Series/ -type d -exec rename -n 's/.*(Season \d)/$1/' {} ";"

rename команда является частью пакета Perl. Это не обеспечивается другими дистрибутивами, они вместо этого предоставляют стандартный Linux rename команда, которая не полезна здесь.

Если rename -n (-не действительно), отображает то, что это хочет сделать, и это в порядке для Вас, опустите-n и заставьте его произойти.

10
27.01.2020, 20:01
  • 1
    Должен сказать, я нашел этот метод особенно полезным за последние несколько дней - не только для папок, но и файлов также.Спасибо. –  Denham Coote 30.04.2012, 11:24
  • 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
  • 3
    ! Это заставило меня сделать это для нескольких файлов в нескольких каталогах! –  eusoubrasileiro 04.11.2016, 22:22

Следующий отрывок разделяет что-либо, что происходит перед последним вхождением 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
2
27.01.2020, 20:01

Если Вы предпочитаете избегать рискованных действий и только переименовывать 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} удалите самое долгое соответствие.

2
27.01.2020, 20:01

Я собираюсь отправить еще два решения в надежде, что они могут быть полезными в будущем. Они прибыли от администраторов Linux в работу. Просто идет для показа, сколько молотков будет работать над этим гвоздем!

Решение 1:

Привет 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


Решение 2:

Привет 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 3

someuser@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

0
27.01.2020, 20:01

Теги

Похожие вопросы