2015-01-22 6 views
0

Прежде всего, я хотел бы сказать, что я знаю, что это почти точный дубликат некоторых сообщений, которые я прочитал, но им не удавалось ссылаться.Использование 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 

Однако это только изменяет содержимое, а не само имя файла. Я прочитал, что mv - это решение (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

Попробуйте 'эхо "$ фл"' вместо 'эхо "$ файл"' в 'mv' команды. – Wintermute

+0

Я буквально самый худший. Спасибо. Если вы оставите этот комментарий в качестве ответа, я бы хотел его выбрать и закрыть. – Joshua

ответ

0

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

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_» файл не существует ...

0
#!/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 
  • с немного более securisation позволяют пройти несколько раз на ту же папку (изменение требуется только один).
  • Под Linux (не Posix СЭД по умолчанию), используйте sed --posix вместо простого SED вызова