Вы использовали эту команду:
while read line; do
sed -i 's/'"$line"'/#%%#'"$line"'/' /system/etc/hosts;
done < modifyhostslist.txt
Пока строки в modifyhostslist.txt
совпадают со строками в /system/etc/hosts
, эта команда действительно должна работать.
Если строки выглядят одинаково, но команда все равно не работает, причиной может быть несоответствие между (невидимыми) окончаниями строк. DOS/Windows файлы имеют двухсимвольные строковые окончания, в то время как Unix и Mac используют односимвольные строковые окончания. Если проблема в этом, то решение - удалить оскорбительные символы. Так как hosts
является системным файлом Unix, я ожидаю, что он имеет правильные строковые окончания, и поэтому нам нужно удалить лишние \r
символы из файла modifyhostslist.txt
. Это можно сделать следующим образом:
while read line; do
sed -i 's/'"$(echo "$line" | tr -d '\r')"'/#%%#'"$line"'/' /system/etc/hosts;
done < modifyhostslist.txt
Что именно здесь вопрос?
Вы должны добавить некоторые детали на свой шаблон вызова rsync
, чтобы получить какую-либо значимую помощь. Я использовал rsync
в течение многих лет без проблем. Я думаю, что безопасно сказать, что любая очевидная коррупция связана с неправильным использованием этого универсального инструмента. Если вы не пройдете -C
, rsync
проживает на основе времени и размера модификации. Даже если вы пройдете -C
, rsync
не будет обновляться, если вы также пройдете -U
, и файл новее новее на приемнике. Если вы пройдете - в помещении
, rsync
обновляет файлы назначения на месте. Я просто даю их в качестве примеров, чтобы показать, что существует лота взаимодействия между вариантами rsync
, и вам действительно нужно добавить детали о том, как вы вызываете rsync
.
Я могу понять, что файл становится коррумпированным, если он написан, чтобы быть синхронизированным, но я не думаю, что он написан.
, а не угадывание, как насчет работы inotify
(например, в содержащем каталог файла), чтобы определить, что файл обновляется только одним процессом в любое время?