Я получаю видеофайлы с разными именами, но последние 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}
и разделить его на тройки цифр.