Расширение переменной $ {varname% _ *}
удалит все от (последнего) _
до конца строки.
Так, например,
$ name=WhatIWant_WhatIDontWant.txt
$ echo ${name%_*}
WhatIWant
Обратите внимание, что он также удаляет .txt
.
Таким образом, мы можем построить простой цикл:
for name in *.txt
do
mv -i "$name" "${name%_*}.txt"
done
Если вам нужна эта рекурсивная функция, может быть достаточно чего-то вроде
find . -name '*.txt' | while read -r "name"
do
mv -i "$name" "${name%_*}.txt"
done
, но будьте осторожны, если какой-либо файл имеет встроенный символ возврата; это нарушило бы этот цикл.