У меня есть структура удаления файловой системы, как это:

+ /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?

2 ответа2

2

rysnc - отличная утилита для синхронизации иерархий каталогов. В идеале rsync должен быть установлен как на сервере, так и на клиенте, но он будет работать, даже если он установлен только на клиенте. Эти команды будут передавать файлы, которые еще не существуют на локальном компьютере, и запускать на них myapp .

cd DESTINATION_DIR
rsync -rv --ignore-existing --log-format='%o %f' USER@HOST:/PATH_TO_measure_DIR . | grep recv | sed "s,recv ,," | xargs -i sh -c "[ -f {} ] && /usr/local/bin/myapp -import {}"

rsync переносит файлы (сохраняя структуру каталогов), затем мы анализируем список полученных файлов, проверяем, являются ли они обычными файлами (мы не хотим запускать myapp для вновь создаваемых каталогов), а затем вызываем на них myapp .

1

смонтировать каталог сервера локально к вам:

sshfs  username@servername:/path/ /mount

или же

curlftpfs username@servername:/path/ /mount

затем

rsync -av /mount /data/ > /data/rsync.log

он копирует только новые файлы, и у вас есть имена файлов в файле журнала

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .