LINUX.ORG.RU

Как определить, что файл изменился без его закгрузки по FTP

 


0

2

Добрый день, возникла такая задача, требуется скачать файл с FTP севрвера (java) только если его содержание изменилось. Сперва использовал его размер как метку, но не подходит, т.к. иногда файл может менять без изменения размера. Есть вариант еще использовать метку времени модификации файла и сохранять на клиенте, но что-то подсказывает что это как-то криво. Конечно в идеале хорошо бы если бы ftp сервер мог выдавать мне md5 файла или crc, но у меня пока ProFTPD и он без установки модулей такой функциональностью не обладает. Пока единственное до чего додумался класть на этот ftp список файлов с md5, скачивать его, а затем проверять локальные файлы на соответствие этому списку. Может быть можно как-нибудь проще? Модули на ProfTPD mod_digit вроде ставить не хочется, т.к. сегодня proftpd, а завтра что-нибудь еще.


до чего додумался класть на этот ftp список файлов с md5, скачивать его, а затем проверять локальные файлы на соответствие этому списку. Может быть можно как-нибудь проще?

Так это и есть то самое «проще», поэтому многие FTP так и делают.

anonymous
()
Ответ на: комментарий от anonymous

Ну вот например можно сохранять время модификации файла и сохранить где-нибудь на клиенте, в некоторых случаях получится проще.

da17
() автор топика
Ответ на: комментарий от da17

в некоторых случаях получится проще.

И во всех случаях сомнительней. Не знаю FTP, которые пользуют подобное для синха.

anonymous
()

Выкинуть ублюдка ftp, использовать http if-modified-since/last-modified и if-none-matches/etag. А так-то по модтайму всегда такие вещи проверяли, чем тебе это криво?

slovazap ★★★★★
()
Ответ на: комментарий от anonymous

Примерно также устроены репозитории как минимум у yum/dnf, причем они работают даже по убогому в сравнении с ftp http.

legolegs ★★★★★
()
Ответ на: комментарий от da17

время модификации файла и сохранить где-нибудь на клиенте

Внезапно время модификации на клиенте можно хранить в поле «время модификации», которое есть буквально во всех файловых системах.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)

Прикладывать к файлу md5 и сверять его?)

phoen ★★
()

По ftp сравнивают время и длину файла, других вариантов нет. Но этот способ предполагает потенциальную ошибку, содержимое при совпадении может быть разным

Поэтому и используют rsync

ism ★★★
()
Ответ на: комментарий от legolegs

Там алгоритм сравнения, mtime и размер лишь часть, можно включить сравнение по хешу

Сравнение по времени между разными ОС может дать приколы

ism ★★★
()
Последнее исправление: ism (всего исправлений: 1)
Ответ на: комментарий от ism

Ну сервер наверное в своем часовом поясе ставит метку времени, если файл скачать и сохранить где-то еще это поле, вполне достаточно для идентификации уникальности. У меня просто идут сообщения на Ftp небольшого объема и часто получается что изменяется файл без изменения содержимого. Думаю придется прикладывать еще список вида Файл:md5.

da17
() автор топика
Ответ на: комментарий от da17

ftp вообще не годится для синхронизаций, нужно писать спец софтину и костыли

ism ★★★
()

modification time... нельзя изменить файл и не именить мтайм... постфактум мтайм можно изменить но никому кроме злонамеренного чела такое не нужно...

Jetty ★★★★★
()

Как определить, что файл изменился без его закгрузки по FTP

wget -N проверяет timestamp и не качает файл, если он не менялся. Загружается только листинг каталога. Только в случае очень большого количества маленьких файлов в одном каталоге получается выгоднее перекачать файл.

gag ★★★★★
()
Ответ на: комментарий от legolegs

Ну конечно, ведь читать гигабайты - это то же самое, что и не читать, ага

Если нужна гарантия других вариантов нет. Кроме того, если есть разница во времени, он все равно будет сравнивать контрольные суммы частей файла

Кроме того есть предположение, что алгоритм rsync быстрее md5

ism ★★★
()
Ответ на: комментарий от ism

Если нужна гарантия других вариантов нет.

Не все так просто. Если у нас бекап и контрольные суммы перестали совпадать - это может быть bit rot на источнике.

если есть разница во времени

Есть типовые проблемы и известные решения для них, в т.ч. для rsync - часовые пояса, летнее время, некоторые фс округляют время до чётного числа секунд.

предположение, что алгоритм rsync быстрее md5

Хороший алгоритм упирается в железные ограничения. Быстрее ~100мб/сек со шпинделя не почитаешь. Спасибо рсинку, что он по сети не гоняет данные чтоб сравнить побайтово.

legolegs ★★★★★
()
Ответ на: комментарий от gag

Да я вчера сделал файлы дополнительные с контрольными суммами и понял, что глупость так-то сделал. Если файл маленький, а у меня есть проблемы с маленькими файлами т.к. там содержится что-то вроде телеметрии в три строки по 40 символов, которая может изменять значение при полном сохранении длины файла. Дешевле это скачать, думаю даже в один ip пакет поместится, а если например большие файлы, то тут вероятность совпадения размеров крайне низкая. Так что правило, одинаковый размер, файлы не изменялись дает практически 99% вероятность.

da17
() автор топика

Может быть можно как-нибудь проще?

man lftp, искать команду mirror.

legolegs ★★★★★
()

Проверять время последнего изменения файла это единственный адекватный способ.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

В общем я понял, что FTP для этого так не подходит, надо небольшую обертку над ним делать и часть информации хранить на клиенте.

da17
() автор топика
Ответ на: комментарий от Legioner

А если файл например был перезаписан тем же самым содержимым то метка времени изменится, а файл останется прежним.

da17
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.