У меня есть несколько файлов, таких как:
20150716_something-here
20150716_something-heretoo
20150716_something-hereaswell
Их нужно переименовать как
2015-07-16_something-here
2015-07-16_something-heretoo
2015-07-16_something-hereaswell
Я пробовал использоватьреализация perlпринадлежащийrename
команда(см. мой комментарий к принятому ответу), но мне это не удалось.
решение1
Использование встроенного расширения подстрок bash:
for f in 2015* ; do
mv "$f" "${f::4}-${f:4:2}-${f:6}"
done
решение2
С sed
:
LC_ALL=C sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/' <file
решение3
Хотя rename
это очень мощный инструмент, я обычно предпочитаю простотуmmv
(многократный ход) полезность:
mmv '????????_*' '#1#2#3#4-#5#6-#7#8_#9'
В ?
шаблоне поиска обозначает один символ, *
для произвольной последовательности символов. В шаблоне замены каждый #<number>
обозначает соответствующий ?
или *
в шаблоне поиска. В дополнение к ?
и *
поддерживает mmv
диапазоны символов в скобках (например [a-f]
).
( mmv
перед началом работы будет выполнена проверка на наличие конфликтов при переименовании, поэтому вы не рискуете потерять файлы из-за перезаписи.)
решение4
В моем дистрибутиве есть perl-rename
команда, которая может использовать регулярное выражение в стиле perl для массового переименования файлов. Команда rename
принимает только пару фиксированных строк для переименования.