Итак, у меня есть каталог с вложенными папками, и в каком-то месте находятся .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'