Использование sed и mv для добавления символов в файлы

Прежде всего, я хотел бы сказать, что я знаю, что это почти точная копия некоторых постов, которые я прочитал, но мне не повезло с ссылками.

У меня есть более 100 файлов, которые следуют очень строгому соглашению об именах 5_##_<name>.ext Моя проблема заключалась в том, что при создании этих файлов я не осознавал, что 5_100_ и выше испортит мой порядок.

Сейчас я пытаюсь добавить 0 перед каждым числом от 01 до 99. Я написал сценарий bash, используя sed, который работает с содержимым файла (имя файла тоже в файле):

#!/bin/bash
for fl in *.tcl; do

    echo Filename: $fl

    #sed -i 's/5_\(..\)_/5_0\1_/g' $fl

done

Однако это только меняет содержимое, а не само имя файла. Я читал, что М.В. является решением (rename проще, но у меня его нет в моей системе). Мое текущее воплощение моих многочисленных попыток:

mv "$fl" $(echo "$file" | sed -e 's/5_\(..\)_/5_0\1_/g') но это дает мне ошибку: mv: missing destination file operand after <filename>

Опять же, я сожалею о дубликате, но я не смог решить мою проблему, прочитав его. Я уверен, что я просто использую комбинацию mv а также sed неправильно.


Решение было введено в комментариях. Я использовал $file вместо $fl.

2 ответа

Решение

Нечто подобное может быть полезным:

for n in $(seq 99)
do
  prefix2="5_$(printf "%02d" ${n})_"
  prefix3="5_$(printf "%03d" ${n})_"

  for f in ${prefix2}*.tcl
  do
    suffix="${f#${prefix2}}"

    [[ -r "${prefix3}${suffix}" ]] || mv "${prefix2}${suffix}" "${prefix3}${suffix}"

  done
done

Вместо того, чтобы обрабатывать каждый отдельный файл, он просматривает только те, которые в настоящее время имеют префикс "5_XX_", и переименовывает их, только если соответствующий файл "5_XXX_" еще не существует...

#!/bin/bash
for fl in *.tcl
 do
    NewName="$(echo "${fl} | sed '/^5_[0-9]\{2\}_/ s/../&0/' )"
    #echo "Filename: ${fl} -> ${NewName}

    [ ! "${fl}" = "${NewName}" ] && mv ${fl} ${NewName}
done
  • С некоторой секьюризацией можно проходить несколько раз в одной и той же папке (для изменения требуется только одна).
  • Под linux (по умолчанию не posix sed) используйте sed --posix вместо простого вызова sed
Другие вопросы по тегам