Как переименовать файлы без расширения

Как переименовать файлы без расширения

У меня есть куча файлов, которые нужно переименовать программно, чтобы приложение их поняло.

Они имеют такое форматирование: Файлы для переименования

Мне нужно вырезать от конца до первой _ и заменить ее точкой (.).

Поскольку я заранее не знаю ни длины имени файла, ни количества символов _ в имени файла, есть ли у вас какие-либо идеи с помощью awk/sed/cut?

решение1

for F in *_*; do echo mv -- "${F}" "${F%_*}.${F##*_}"; done

Если вывод выглядит корректно, удалите echoкоманду выше.

Хитрость в том, что ${F%_*}удаляет последний _26и ${F##*_}удаляет все, что находится перед последним _. Попробуйте эти команды, чтобы увидеть, как это работает. Теперь разделитель ::

echo "${PATH}"
echo "${PATH%:*}"
echo "${PATH##*:}"
echo "${PATH%:*}_${PATH##*:}"

решение2

С использованиемsed

for file in *_*
do 
    echo mv $file $( sed 's/\(.*\)_/\1\./' <<< $file)
done

Удалите, echoесли вас все устраивает.

решение3

Вы можете заменить последний блок на sed, используя маркер конца строки ( $).

#/bin/bash
for file in *_* ; do
  #any alphanumeric string as suffix
  mv $file $( sed 's/_\([A-Za-z0-9]\{1,\}\)$/.\1/' <<< $file )
  #alternatively numbers only as in given input sample
  mv $file $( sed 's/_\([0-9]\{1,\}\)$/.\1/' <<< $file )
done

Насколько мне известно, \{1,\}часть «один или несколько» из предыдущего списка относится к GNU sed, но я не уверен на 100% в этом ограничении.

Связанный контент