Вот что у меня есть на данный момент:
rename -n 's/(\d+)\.txt/sprintf "%03d", $1/e' ./*.txt
Это добавляет ведущие нули, но, к сожалению, удаляет расширение:
rename(./1.txt, ./001)
rename(./2.txt, ./002)
rename(./3.txt, ./003)
Я попробовал следующее, но это не помогло:
rename -n 's/(\d+)(\.txt)/sprintf "%03d", $1/e$2' ./*.txt
rename -n 's/(\d+)(\.txt)/(sprintf "%03d", $1/e)$2' ./*.txt
Как заставить это работать?
Извините, я поторопился с этим комментарием, \K
держит левую сторону, а не правую. Но $2 работает, если вы поместите его в оператор замены. s/(\d+)(\.txt)/sprintf "%03d%s", $1, $2/e
. Или вы можете использовать предварительное утверждение s/(\d+)(?=\.txt)/sprintf "%03d", $1/e
Я считаю, что ваш rename
удаляет расширение, потому что вы это сказали. То есть ваш 's/(\d+)\.txt/sprintf "%03d", $1/e'
заменяет \d+\.txt
результатами sprintf "%03d", $1
, которые не включают расширение.
Все, что вам действительно нужно сделать, это заменить целую часть имени файла версией с нулевым дополнением. Что-то вроде
rename 's/(\d+)/sprintf "%03d", $1/e' *.txt
должен сделать свое дело.
PS: Другие вещи, которые вы пробовали, не сработали, потому что вы поставили $2
после выражения замены, которое заканчивается на /e
. Что-то вроде rename 's/(\d+)\.txt/sprintf "%03d.txt", $1/e' *.txt
тоже должно было сработать, хотя я этого не пробовал.
Re «Что-то вроде». Это все еще не демонстрирует, как использовать $2
. Минимальное исправление на самом деле будет s/(\d+)(\.txt)/sprintf("%03d", $1) . $2/e
или s/(\d+)(\.txt)/sprintf "%03d%s", $1, $2/e
.
@TLP
rename -v
:/Users/nick/perl5/bin/rename using File::Rename version 2.02, File::Rename::Options version 2.01
. Я буду тестировать\K
ещё, но сейчасrename -n 's/(\d+)\K\.txt/sprintf "%03d", $1/e' ./*.txt
переименовывает1.txt
в1001
,2.txt
в2002
и т. д.