Это происходит из-за того, что команда в подоболочке, т.е.
echo {} | sed 's/\.py/_2\.py/g'
выполняется перед эхом, поэтому после этой команды команда будет:
xargs -I{} echo {}
, который просто выведет все имена файлов _.
Вы можете использовать команду поиска:
find directory_name -name '*.py' \
-exec rename 's/.py/_2.py/' {} +
Он переименует все файлы одной командой.
Чтобы найти файлы только в текущем каталоге, а не в подкаталогах, используйте параметр maxdepth 1
, т.е.:
find directory_name -maxdepth 1 -name '*.py' \
-exec rename 's/.py/_2.py/' {} +