Редактировать
Вы почти у цели;Вы просто попали в тонкость цитирования.i
объявлено в текущей оболочке, поэтому его необходимо каким-то образом передать в sh
, запущенный find
.В вашей текущей команде ${i}
в одинарных кавычках, поэтому не интерпретируется bash
до того, как цитируемый материал передан sh
.
Как предложил Чарльз Даффи:
find . -type f -exec sh -c ' echo mv "$0" "${0%.*}${1}.${0##*.}" ' {} "$i" \;
В команде sh
, как вы знаете, $0
- это {}
.$1
является вторым параметром sh
, который "$i"
(i
раскрывается как одно слово).Вместо ${i}
команда sh
использует ${1}
для доступа к этому параметру (копия i
).
Оригинал
В этом примере i
интерполируетсяв текущей оболочке.
Before: find . -type f -exec sh -c ' echo mv "$0" "${0%.*}${i}.${0##*.}" ' {} \;
After: find . -type f -exec sh -c ' echo mv "$0" "${0%.*}'"${i}"'.${0##*.}" ' {} \;
^^ ^^
'"${i}"'
выбрасывает вас из одинарных кавычек, затем расширяет i
, а затем возвращает вас в одинарные кавычки.Таким образом, команда, которую вы передаете sh
, содержит значение i
, которое вы хотите.