TL; DR: Попробуйте этот код:
find . -name '*.JPG' -type f -exec sh -c 'mv $0 ${0/.JPG/.jpg}' {} \;
Дополнительные комментарии:
Ваш код довольно близок к тому, где он должен быть.Однако существует проблема, поскольку $ 1 не определено.
Я запустил следующий код, чтобы выяснить, какое значение будет в $ 1.
$ ls
bye.jpg hi.JPG
$ find . -regex ".*\.JPG" -exec sh -c 'echo "$0" | sed "s/\.JPG/\.jpg/" && echo "0:$0 1:$1" ' {} \;
./hi.jpg
0:./hi.JPG 1:
Согласно моим результатам выше, значение не в $ 1.Вы должны знать, что $ 1 на самом деле ссылается на второй параметр, передаваемый sh.То есть sh -c 'code' $ 0 $ 1 ...
В любом случае вам нужно будет записать результат команды sed в переменную, чтобы передать его команде перемещения следующим образом:
find . -regex ".*\.JPG" -exec sh -c '
lower=$( echo "$0" | sed -r "s/\.JPG/\.jpg/" )
mv "$0" "$lower"
' {} \;
Все, что сказано, вы могли бы сделать это более кратким.Как подсказывает PS, цикл for - это хороший выбор.Кроме того, замена JPG -> jpb более читабельна с предложением PS.Если вы проданы с использованием find, вы можете включить предложение PS следующим образом:
find . -regex ".*\.JPG" -exec sh -c '
filename=$0
mv "$filename" "${filename/.JPG/.jpg}"
' {} \;