
У меня есть куча файлов, которые нужно переименовать программно, чтобы приложение их поняло.
Они имеют такое форматирование:
Мне нужно вырезать от конца до первой _ и заменить ее точкой (.).
Поскольку я заранее не знаю ни длины имени файла, ни количества символов _ в имени файла, есть ли у вас какие-либо идеи с помощью 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% в этом ограничении.