Автоматическое копирование файлов при добавлении в сетевой ресурс
В моей системе есть сетевой ресурс, на который наш сканер плоттеров отправляет отсканированные файлы. Как я могу написать скрипт для автоматического копирования вновь добавленных файлов в другую папку?
2 ответа
cron
а также rsync
были бы мои инструменты выбора. Я собираюсь предположить, что вы подключили эту сетевую папку с помощью naultilus или другого метода. Существуют и другие, более эффективные способы монтирования, чем с помощью Naultilus (особенно для сценариев), но я оставлю это на ваше усмотрение:
Откройте терминал и запустите crontab -e
, Вас могут попросить выбрать редактора (nano
проще всего). Там вы хотите добавить новую строку, которая выглядит примерно так:
*/5 * * * * rsync -avz ~/.gvfs/remote/path/ ~/scans/
Control-x, затем y, чтобы сохранить.
Это будет синхронизировать все от ~/.gvfs/remote/path/
в ~/scans/
каждые пять минут. Это не будет повторно загружать вещи, которые не изменились. Конечно, вы захотите отредактировать пути и, возможно, захотите изменить время для выражения cron. Возможно, вы захотите ограничить его в часах или запускать чаще.
- Позволять
$share
содержит путь к вашей "папке (...), в которую наш сканер плоттеров отправляет отсканированные файлы" - Позволять
$afolder
содержать путь к вашей "другой папке"
Мой упрощенный подход заключается в том, чтобы сохранить список файлов в $share
, Напишите скрипт, который проверяет, находятся ли файлы в данный момент $share
находятся в этом списке. Это не так, они должны быть новыми и должны быть перемещены. Затем добавьте этот скрипт в cron
Таким образом, работает это регулярно.
Позволять $filelist
содержать путь к указанному списку файлов.
Скрипт (не проверенный - просто шаблон):
#!/bin/bash
...variables as discussed....
filelist=/some/path/to/the/aforementioned/filelist
find "$share" -type f >> /tmp/foundfiles
while read fnd; do #walk files in folder
isinlist=""
while read listitem; do #walk listitems
if [ "$fnd" -ef "$listitem" ]; then
echo "$fnd Allready in list."
isinlist="inlist"
fi
done < "$filelist"
if [ ! -n "$isinlist ]; then
echo "$fnd" >> "$filelist"
cp "$fnd" to "$afolder"
fi
done < /tmp/foundfiles
rm /tmp/foundfiles
exit 0
Есть инструменты, которые делают это для вас, например, rsync. Но, может быть, вы хотите добавить некоторые пользовательские функции.