Remove today's date string from all filenames in folder

У меня есть папка, полная jpegs, отформатированных так:

0001_20210516_XYZ.jpg
0002_20210516_XYZ.jpg
123_20210516_XYZ.jpg
01_20210516_XYZ.jpg

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

0001_XYZ.jpg
0002_XYZ.jpg
123_XYZ.jpg
01_XYZ.jpg

Я пытался использовать этот ответ, чтобы написать regex для удаления 8 цифр, используя этот код:

rename - 's/^_\d{8}\_//' *

Но это ничего не дало. Я не уверен, как правильно отформатировать это, чтобы средняя строка даты была удалена.

0
задан 16 June 2021 в 19:04

1 ответ

Чтобы удалить первое подчеркивание и следующие 8 цифр, используя rename (он же file-rename), основанный на Perl, вам нужно убрать якорь начала строки ^ и второе подчеркивание (иначе вы получите 0001XYZ. jpg и т.д.)

Итак:

rename -n 's/_\d{8}//' *_*_*.jpg

В качестве альтернативы вы можете использовать mmv (из одноименного пакета Ubuntu):

mmv -n '*_*_*.jpg' '#1_#3.jpg'

В любом случае, -n предназначен для тестирования - удалите его, когда будете довольны предложенными изменениями.

Если вы застряли с версией rename из util-linux (которая установлена как rename.ul в моей системе), то, вероятно, лучшее, что вы сможете сделать, это подобрать литеральную строку _20210516:

rename.ul -vn _20210516 '' *_*_*.jpg

Если вам действительно нужно удалить сегодняшнюю дату, вы можете обобщить это до

rename.ul -vn "_$(date +%Y%m%d)" '' *_*_*.jpg

(Обратите внимание, что rename. ul из util-linux 2.34 поддерживает опцию -n, которую я использую здесь в демонстрационных целях - настройте соответствующим образом, если в вашей версии ее нет).

3
ответ дан 28 July 2021 в 11:28

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

Похожие вопросы: