У меня есть структура удаления файловой системы, как это:
+ /measure
+ / 2013-09
+ / 2013-09-04
+ / fooinstrument
+ result03343445845.csv
+ result03343445846.csv
+ / barinstrument
+ result03343445847.csv
+ result03343445848.csv
Он содержит много файлов в иерархической структуре. У меня есть доступ только для чтения по этому протоколу через SFTP (нет других протоколов, таких как CIFS или какого-либо специального программного обеспечения, запущенного на сервере). (Поэтому я не могу установить программное обеспечение на исходном хосте.)
Я хочу импортировать эти файлы в свою базу данных каждый вечер, используя задание cron (само задание cron не является проблемой). Поэтому я хотел бы рекурсивно загрузить все новые файлы в мою локальную файловую систему и затем передать путь каждого загруженного файла в мое приложение (его имя файла в качестве параметра командной строки), например:
/usr/local/bin/myapp -import /srv/localstorage/result03343445845.csv
Этот вызов myapp
не является критическим моментом. Если я могу получить список всех загруженных путей, передавая вывод загрузчика в какой-либо файл, я могу читать список файлов построчно позже и вызывать приложение. Это не проблема.
Меня не волнует исходная иерархия каталогов. Моя главная цель - передать файлы в мою локальную файловую систему, чтобы мой инструмент командной строки мог получать имя файла в качестве входных данных. Поэтому неважно, есть ли у меня дубликат глубокой иерархии, заданной сервером, или все файлы находятся в одном каталоге. Последнее может быть еще интереснее, поскольку имена файлов являются уникальными сериалами. Так что нет проблем переместить все файлы вместе в один каталог.
+ / localstorage
+ result03343445845.csv
+ result03343445846.csv
+ result03343445847.csv
+ result03343445848.csv
Одна из моих проблем заключается в том, что исходные файлы остаются на сервере навсегда. Таким образом, сервер не удаляет старые файлы, которые я уже скачал, так как я не единственный, кто собирает эти данные. Таким образом, скрипт должен "помнить", какие файлы старые (=> не загружать!), Например, сохраняя локальные копии всех когда-либо полученных файлов. (Если два файла имеют одинаковые имена файлов, их можно смело считать равными, поскольку имя файла состоит из серийного номера. Так что сравнение контента не требуется.)
Еще один важный момент: через год, вероятно, будет 30 000 файлов или даже больше. Не было смысла загружать все файлы каждую ночь, включая старые, которые у меня уже есть. Таким образом, действительно необходимо только загрузить новые файлы (new = нет такого имени файла в локальной копии).
Какой самый простой и лучший способ сделать это в Linux (Debian)? Я думал о сценарии оболочки, который использует sftp
, scp
или, может быть, даже curl
? Большое спасибо за ваш совет и ваши идеи по поводу такого сценария!
// edit: Кстати, что ты думаешь? Вопрос лучше вписывается в Serverfault?