массовое переименование файлов не работает

Самый простой способ сделать это с помощью sed - с помощью группировки команд:

{ sed '/PATTERN/!d;s///;q'; cat; } <infile

it d удаляет все строки, которые не совпадают, при первом совпадении s ubstitutes по вашему запросу и завершается (автоматическая печать), затем cat берет на себя и печатает оставшиеся строки, если таковые имеются.
Не хочу сказать, что вы не можете сделать это только с sed :

sed '/PATTERN/,$!d         # delete all lines not in this range
//{                        # if the line matches
x;//!{                     # exchange and IF what was in hold space doesn't match
g;s///;b                   # get hold space content, replace, go to end of script
}
x                          # ELSE exchange back (do nothing)
}' <infile

Я использовал ШАБЛОН , чтобы не усложнять (замените его на ^. * Комментарий - или какой там шаблон).

1
08.01.2016, 10:19
2 ответа

Я предполагаю, что из вашей (закомментированной) команды sed вы хотите, чтобы соответствовал и заменял регулярное выражение: [1-9] [0-9]? , что означает

  • ненулевую цифру ( [1-9] ), за которой следует
  • ноль или одна цифра (и) ( [0-9]? )

, которое является довольно распространенным регулярным выражением для целых чисел от 1 до 99 (без нуля в начале). Однако $ { параметр / шаблон / строка } не использует регулярные выражения, он использует шаблоны расширения имени пути (также известные как подстановочные знаки). Итак, [1-9] [0-9]? означает

  • ненулевую цифру ( [1-9] ), за которой следует
  • цифра ( [0-9] ), за которой следует
  • любой символ (? )

Тем не менее, это должно было работать для двузначных имен файлов, { {1}}, хотя он потребляет . и переименуйте 10.jpg в 46jpg (без . ).


Что касается другой части вашего вопроса, // заменяет все вхождения шаблона , while / заменяет только первый. Например,

$ i=cataract
$ echo "${i/a/X}"
cXtaract
$ echo "${i//a/X}"
cXtXrXct
2
27.01.2020, 23:27

Если у вас есть Perl rename (иногда называемый prename), вы можете сделать следующее:

rename -v 's!(\d+)(.*)\.jpg$!sprintf "%d%s.png", $1+36, $2!e' *.jpg

Берется каждое имя файла, отделяются ведущие цифры, остальная часть имени файла и идущие следом . jpg. Затем прибавляет 36 к числовой части, добавляет остаток исходного имени файла и заменяет суффикс на .png.

Используйте rename -n ... , чтобы посмотреть, что произойдет, если она ничего не изменит, или удалите -v, чтобы она выполнялась без звука.

1
27.01.2020, 23:27

Теги

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