
У меня есть много папок и подпапок с файлами с именами. 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
снова добавить суффикс.
Без использования find
(в bash
):
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)
заставляет предыдущий шаблон соответствовать только обычным файлам, в то время как N
and 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
.