Проверка наличия файла xyz
не поможет: вы можете упустить права на запись в yza
. Сначала скопируйте оба файла и удалите оригиналы, если обе сработавшие копии тоже могут выйти из строя.Другая программа могла ожидать bcd
и начать некоторую обработку перед откатом.Вы можете попробовать что-то с каталогом tmp:
rollback() {
mv ${tmpdir}/bcd abc
mv ${tmpdir}/yza xyz
rm -r ${tmpdir}
echo "action failed"
exit
}
tmpdir=/tmp/movetwo
mkdir ${tmpdir} || exit
cp abc ${tmpdir}/bcd || rollback
cp xyz ${tmpdir}/yza || rollback
rm abc ${tmpdir}/bcd || rollback
rm xyz ${tmpdir}/yza || rollback
cp ${tmpdir}/bcd bcd || rollback
cp ${tmpdir}/yza yza || rollback
rm -r ${tmpdir}
Это может все же пойти не так по-разному (после удаления abc
, какой-то другой процесс заполняет свободное место на диске, разрешения изменены, ...)
Вы можете попробовать что-то подобное с
# check bcd and yza not exist, code can not handle that
test -f bcd && { echo "nope"; exit 1; }
test -f yza && { echo "nope"; exit 1; }
# optional other tests: you can delete abc xyz, other tests...
ln abc bcd && ln xyz yza && rm abc xyz
#cleanup when moving abc failed
test -f abc && { mv yza xyz; rm bcd; }
#cleanup when moving xyz failed
test -f xyz && { mv bcd abc; rm yza; }