У меня есть виртуальная машина, на которой работает одно из наших основных приложений. Перед тем, как сделать довольно тяжелое изменение, я сделал две резервные копии. Сначала я сделал снимок виртуальной машины. Во-вторых, я запустил рекурсивный sed
команда через всю систему для замены текста в файлах и создания резервных копий по ходу. Только после того, как я запустил это, я понял, насколько обширным было изменение. Вот что я запустил:
find / -type f -print0|xargs -0 sed -i.matthew05012013 's/oldtext/newtext/g'
Я попытался отменить снимок, но вместо этого удалил его, что зафиксировало все изменения (потому что номенклатура ESX чертовски сбивает с толку снимки). Итак, моя последняя линия защиты рекурсивно проходит через систему и переименовывает что-либо с расширением .matthew05012013, добавленным к тому же имени файла, без расширения, перезаписывая все, что есть.
Есть ли у кого-нибудь идеи, как это лучше всего выполнить? Вручную не получится, есть несколько тысяч файлов, которые были изменены в системе.
Хотя это не совсем изящно, но следующее должно помочь:
for modfile in `find <dir> -name "*.matthew05012013"`; do
realfile=`echo $modfile | sed 's/.matthew05012013//'`
cp $modfile $realfile
done
Я сделал это в тестовом каталоге:
$ find /tmp/deleteme/
/tmp/deleteme/
/tmp/deleteme/1
/tmp/deleteme/1/filea
/tmp/deleteme/1/fileb
/tmp/deleteme/1/filec
/tmp/deleteme/1/filed
/tmp/deleteme/1/fileb.matthew05012013
/tmp/deleteme/1/filed.matthew05012013
/tmp/deleteme/2
/tmp/deleteme/2/filea
/tmp/deleteme/2/fileb
/tmp/deleteme/2/filec
/tmp/deleteme/2/filed
/tmp/deleteme/2/fileb.matthew05012013
/tmp/deleteme/2/filed.matthew05012013
/tmp/deleteme/3
/tmp/deleteme/3/filea
/tmp/deleteme/3/fileb
/tmp/deleteme/3/filec
/tmp/deleteme/3/filed
/tmp/deleteme/3/fileb.matthew05012013
/tmp/deleteme/3/filed.matthew05012013
/tmp/deleteme/4
/tmp/deleteme/4/filea
/tmp/deleteme/4/fileb
/tmp/deleteme/4/filec
/tmp/deleteme/4/filed
/tmp/deleteme/4/fileb.matthew05012013
/tmp/deleteme/4/filed.matthew05012013
/tmp/deleteme/5
/tmp/deleteme/5/filea
/tmp/deleteme/5/fileb
/tmp/deleteme/5/filec
/tmp/deleteme/5/filed
/tmp/deleteme/5/fileb.matthew05012013
/tmp/deleteme/5/filed.matthew05012013
/tmp/deleteme/6
/tmp/deleteme/6/filea
/tmp/deleteme/6/fileb
/tmp/deleteme/6/filec
/tmp/deleteme/6/filed
/tmp/deleteme/6/fileb.matthew05012013
/tmp/deleteme/6/filed.matthew05012013
$ for modfile in `find /tmp/deleteme -name "*.matthew05012013"`; do
realfile=`echo $modfile | sed 's/.matthew05012013//'`
echo "cp $modfile $realfile"
done
cp /tmp/deleteme/1/fileb.matthew05012013 /tmp/deleteme/1/fileb
cp /tmp/deleteme/1/filed.matthew05012013 /tmp/deleteme/1/filed
cp /tmp/deleteme/2/fileb.matthew05012013 /tmp/deleteme/2/fileb
cp /tmp/deleteme/2/filed.matthew05012013 /tmp/deleteme/2/filed
cp /tmp/deleteme/3/fileb.matthew05012013 /tmp/deleteme/3/fileb
cp /tmp/deleteme/3/filed.matthew05012013 /tmp/deleteme/3/filed
cp /tmp/deleteme/4/fileb.matthew05012013 /tmp/deleteme/4/fileb
cp /tmp/deleteme/4/filed.matthew05012013 /tmp/deleteme/4/filed
cp /tmp/deleteme/5/fileb.matthew05012013 /tmp/deleteme/5/fileb
cp /tmp/deleteme/5/filed.matthew05012013 /tmp/deleteme/5/filed
cp /tmp/deleteme/6/fileb.matthew05012013 /tmp/deleteme/6/fileb
cp /tmp/deleteme/6/filed.matthew05012013 /tmp/deleteme/6/filed
Очевидно, здесь используется тот же жесткий подход, о котором вы упоминали ранее, и если бы я делал это в производственной среде, я бы, вероятно, повторил команды cp (как показано в моем тесте) и отправил их в файл для проверки. Затем просто выполните их после того, как я убедился, что все в порядке. Просто убедитесь, что искомая строка (.matthew05012013 в примере) достаточно уникальна и не соответствует чему-то еще. И замените «cp» на «mv» или любую другую команду, которая будет управлять вашей лодкой.
Я бы также рекомендовал сделать еще один снимок ПЕРЕД внесением этого изменения, хотя на всякий случай, если что-то пойдет не так, вам не нужно пытаться убрать дополнительный беспорядок.
Также позаботьтесь о сохранении разрешений во время этого изменения. Проверьте страницу руководства cp, чтобы добавить аргументы для сохранения разрешений или реализовать конкретную маску перед выполнением этого. Вы можете быстро оказаться в затруднительном положении, когда у вас есть тысячи файлов с разрешениями, которые не позволяют вашему приложению работать правильно.
find / -type f -name '*.matthew05012013' -print0 | \
xargs -0 rename .matthew05012013 ""
Это не сработает, если есть файлы, в имени которых дважды встречается ".matthew05012013" и один раз в конце. Вероятно, это не так, и этого можно было бы предотвратить с помощью другого инструмента, такого как mmv или простого сценария оболочки.