У меня есть сетевой ресурс в моей системе, куда наш сканер плоттеров отправляет свои отсканированные файлы. Как я могу написать скрипт для автоматического копирования вновь добавленных файлов в другую папку?
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. Но, может быть, вы захотите добавить некоторую функциональность.