Использование 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