Переименовать последние 8 символов в имени файла

Переименовать последние 8 символов в имени файла

Я получаю видеофайлы с разными именами, но последние 8 символов у всех — это цифры (тоже каждый раз разные). Вот шаблон имени файла:

custom text 00030402.avi

Мне нужно сделать так, чтобы имя файла выглядело так:

00\:03\:04\:02

Поэтому мой вопрос заключается в том, как переименовать последние 8 символов и сохранить их, чтобы добиться этого шаблона.

решение1

Используя rename(тот, который perlиногда называют prename, а не util-linux):

rename 's/(\d{2})(\d{2})(\d{2})(\d{2})/$1:$2:$3:$4/'  *.avi

Это приведет к переименованию файла с таким именем, custom text 00030402.aviкак custom text 00:03:04:02.avi.

Если вы используете обратную косую черту в имени файла (перед :), введите:

rename 's/(\d{2})(\d{2})(\d{2})(\d{2})/$1\\:$2\\:$3\\:$4/' *.avi

Чтобы удалить пользовательский текст из имен файлов, выполните:

rename 's/.* (\d{2})(\d{2})(\d{2})(\d{2})(.*)/$1\\:$2\\:$3\\:$4$5/' *.avi

решение2

С zsh:

$ autoload zmv
$ zmv -v '(*)(??)(??)(??).avi' '$1\:$2\:$3\:$4.avi'
mv -- custom\ text\ 00030402.avi custom\ text\ 00\\:03\\:04\\:02.avi

(-v для подробного). Чтобы удалитьпользовательский текст:

$ zmv -v '*(??)(??)(??)(??).avi' '$1\:$2\:$3\:$4.avi'
mv -- custom\ text\ 00030402.avi 00\\:03\\:04\\:02.avi

решение3

Вот как это можно сделать с помощью упреждающего просмотра регулярных выражений Perl:

perl -e '
    while($name=shift){
        @components = split /(?=(?:[0-9]{2})+[^0-9]+$)/,$name;
        shift @components;
        $new_name = join '\:',@components;
        rename $name => $new_name;
    }
' list_of_avi_files

Это будет работать для любого количества пар цифр, а не только для 4. Вы также можете изменить , например, {2}на {3}и разделить его на тройки цифр.

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