Переименование файлов путем удаления разделенной подстроки

Переименование файлов путем удаления разделенной подстроки

У меня есть много папок и подпапок с файлами с именами. 1. Introduction--- [ FreeCourseWeb.com ] ---.mp4Я хочу рекурсивно переименовать все файлы (папки и подпапки), просто 1. Introduction.mp4подавив подстроку --- [ FreeCourseWeb.com ] ---.

решение1

Предположим, что вы хотите переименовать все файлы, которые имеют цифру в начале имени, содержат подстроку ---дважды, сразу за которой следует .mp4в самом конце имени. Кроме того, предположим, что вы хотите удалить бит между двумя ---подстроками, включая сами эти подстроки:

find . -type f -name '[[:digit:]]*---*---.mp4' -exec sh -c '
    for pathname do
        mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
    done' sh {} +

Это позволяет найти все обычные файлы с именами, соответствующими заданному шаблону, в текущем каталоге или ниже, а затем удалить соответствующую строку суффикса ---*---.mp4и .mp4снова добавить суффикс.

Без использования findbash):

shopt -s globstar nullglob dotglob

for pathname in ./**/[[:digit:]]*---*---.mp4; do
    [[ ! -f $pathname ]] && continue
    mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
done

Это по сути то же самое, что и findкоманда, но также переименует символические ссылки. Три параметра оболочки, которые устанавливаются в начале, включают **шаблон подстановки, используемый для сопоставления рекурсивно вниз по подкаталогам ( globstar), гарантируют, что несоответствующие шаблоны будут удалены, а не останутся неразвернутыми ( nullglob), и гарантируют, что шаблоны подстановки будут соответствовать скрытым именам ( dotglob).

В zshоболочке:

for pathname in ./**/[[:digit:]]*---*---.mp4(.ND); do
    mv -i $pathname ${pathname%---*---.mp4}.mp4
done

Здесь точка в квалификаторе glob (.ND)заставляет предыдущий шаблон соответствовать только обычным файлам, в то время как Nand Dдействует как включение nullglobи dotglobв bash, но только для этого конкретного шаблона.

решение2

Используя renameинструмент пакета util-linux(иногда называемый rename.ul) и find:

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;

Опция -iзапрашивает разрешение на перезапись существующих файлов.


Используем скрипт Perl Ларри Уолла renameи find:

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename 's/--- \[ FreeCourseWeb.com \] ---//' {} \;

Существующие файлы не перезаписываются по умолчанию, если не используется опция -f/ --force. Вместо этого вы увидите сообщение об ошибке ... already exists.

Связанный контент