Как удалить подчеркивание между двумя числами во всех файлах в каталоге

Как удалить подчеркивание между двумя числами во всех файлах в каталоге

Итак, у меня есть каталог с вложенными папками, и в каком-то месте находятся .pngизображения.

Названия этих изображений выглядят так: «letters_numbers_numbers_letters.png», и я хочу удалить подчеркивание между цифрами.

Допустим, у нас есть файл с именем a_1_2_b.png, я хочу переименовать его в a_12_b.png. Я знаю, что мне нужно использовать что-то вроде:

find . -name "*[0-9]_[0-9]* -type f -exec bash -c <enter_code here>`

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

Заранее спасибо!

решение1

Используйте один из вариантов perl's rename. Например, сВон тот( renameпакет в системах типа Debian):

LC_ALL=C find . -name '*[0-9]_[0-9]*' -type f -exec rename -n -d '
  s/(?<=\d)_(?=\d)//g' {} +

(удалите -n(холостой ход), когда будете довольны).

С помощью zshвы можете сделать:

autoload -Uz # best in ~/.zshrc
zmv -n  '(**/)(*[0-9]_[0-9]*)(#qD.)' \
        '$1${2//(#m)[0-9][_0-9]#[0-9]/${MATCH//_}}'

Это немного сложнее, поскольку в глобах zsh нет эквивалента операторам регулярного выражения Perl.

Они удаляют все буквы _s, окруженные цифрами, в каждом обычном имени файла ( например, переименовывают dir_1_2_3/file_1_2_foo_22_3_4_barфайл в ).dir_1_2_3/file_12_foo_2234_bar

Чтобы удалить только вторую строку _в обычных файлах, которые следуют letters_digits_digits_letters.pngшаблону, это будет просто:

zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
       '$1$2$3'

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