@sergeiy_permyakov

Как переименовать файлы с определенным условием в Linux?

У меня есть в папке файлы

name1-20-pencvjdvlbfkgbfkgfgjkf.jpg
name3-120-pencvjdvlbfkgbfkgfggrgrgrjkf.jpg
name4-dfdfdfd-pencvjdvlbfkgbfkgfgjkf.webp
name5-2adsd0-wwdencvjdvlbfkgbfkgfgjkf.jpg
name6-2dd-rtywdencvjdvlbfkgbfkgfgjkf.jpg
name7-hhdd-vvvtywdencvjdvlbfkgbfkgfgjkf.webp

Нужно переименовать так чтобы все удалилось все вот эти хвостики из набора букв. Получается если читать справа налево нужно удалить символы от точки до первого тире.
-vvvtywdencvjdvlbfkgbfkgfgjkf в файле name7-hhdd-vvvtywdencvjdvlbfkgbfkgfgjkf.webp должно получится name7-hhdd.webp
-rtywdencvjdvlbfkgbfkgfgjkf в файле name6-2dd-rtywdencvjdvlbfkgbfkgfgjkf.jpg должно получится name6-2dd.jpg
-wwdencvjdvlbfkgbfkgfgjkf в файле name5-2adsd0-wwdencvjdvlbfkgbfkgfgjkf.jpg должно получится name5-2adsd0.jpg и так далее все файлы в одной директории.
  • Вопрос задан
  • 418 просмотров
Пригласить эксперта
Ответы на вопрос 4
shurshur
@shurshur
Сисадмин, просто сисадмин...
В Linux есть замечательная утилита rename. Ну, точнее, их две: одна входит в пакет util-linux, другая - скрипт на базе perl-модуля File::Rename. В deb-дистрибутивах нужный нам скрипт устанавливается в составе пакета rename и также имеет имя второе file-rename (а версия из util-linux имеет имя rename.ul). В других дистрибутивах может быть иначе, поэтому смотрим внимательнее параметры запуска (можно запустить rename без параметров и убедиться, что это нужный вариант).

Синтаксис предельно простой: rename регулярное_выражение_замены_perl имена_файлов

Синтаксис rename.ul для сравнения: rename что_заменить на_что_заменить имена_файлов

Вот что можно сделать для решения задачи (в предположении, что других точек, кроме как перед расширением, в имени файла нет):

rename 's/-\w+\././' *

Этот скрипт намного удобнее многоэтажных однострочников, да и пригодится в жизни ещё не раз.
Ответ написан
shambler81
@shambler81 Куратор тега Linux
https://regex101.com/r/NeoDkO/1
find + regexp
вот так ищешь файлы. - далее можно или через exec
или xargs
или просто через print 0
и sedom поменять до сохранения.
Ответ написан
Комментировать
perl -e 'foreach(glob("*")) { $o = $_; s/^(.+)\-\w+(\.\w+)$/\1\2/; rename($o, $_) or die("ERROR: can not rename $o to $_!\n"); }'
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
find . -type f -exec prename -n 's/-[a-z]+(\.[^.]+)$/$1/' {} +
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы