Использование «переименования» Perl для дополнения имен файлов ведущими нулями

Вот что у меня есть на данный момент:

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

Как заставить это работать?

@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 и т. д.

nick 11.08.2024 19:03

Извините, я поторопился с этим комментарием, \K держит левую сторону, а не правую. Но $2 работает, если вы поместите его в оператор замены. s/(\d+)(\.txt)/sprintf "%03d%s", $1, $2/e. Или вы можете использовать предварительное утверждение s/(\d+)(?=\.txt)/sprintf "%03d", $1/e

TLP 12.08.2024 03:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что ваш 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 тоже должно было сработать, хотя я этого не пробовал.

user20284150 12.08.2024 02:46

Re «Что-то вроде». Это все еще не демонстрирует, как использовать $2. Минимальное исправление на самом деле будет s/(\d+)(\.txt)/sprintf("%03d", $1) . $2/e или s/(\d+)(\.txt)/sprintf "%03d%s", $1, $2/e.

ikegami 12.08.2024 18:24

Другие вопросы по теме