Сценарий в листинге 13.3, syncdropbox, пользуется этим обстоятельством и позволяет легко и просто скопировать каталог с файлами или заданный набор файлов во вселенную Dropbox. В первом случае копируются все файлы в каталоге; во втором — файлы из заданного списка сбрасываются в папку sync в Dropbox.
Листинг 13.3.Сценарий syncdropbox
#!/bin/bash
# syncdropbox — синхронизирует заданный набор файлов или указанную
#·· папку с хранилищем Dropbox. Это достигается путем копирования
#·· папки в ~/Dropbox или набора файлов в папку sync в Dropbox с последующим
#·· запуском Dropbox.app, если это необходимо.
name="syncdropbox"
dropbox="$HOME/Dropbox"
sourcedir=""
targetdir="sync" # Целевая папка в Dropbox для отдельных файлов.
# Проверить начальные аргументы.
if [$# −eq 0]; then
··echo "Usage: $0 [-d source-folder] {file, file, file}" >&2
··exit 1
fi
if ["$1" = "-d"]; then
··sourcedir="$2"
··shift; shift
fi
# Проверка допустимости.
if [! -z "$sourcedir" −a $# −ne 0]; then
··echo "$name: You can't specify both a directory and specific files." >&2
··exit 1
fi
if [! -z "$sourcedir"]; then
··if [! -d "$sourcedir"]; then
····echo "$name: Please specify a source directory with −d." >&2
····exit 1
··fi
fi
#######################
#### ГЛАВНЫЙ БЛОК
#######################
if [! -z "$sourcedir"]; then
··if [-f "$dropbox/$sourcedir" −o — d "$dropbox/$sourcedir"]; then
····echo "$name: Specified source directory $sourcedir already exists." >&2
····exit 1
··fi
··echo "Copying contents of $sourcedir to $dropbox…"
··# −a обеспечивает рекурсивное копирование с сохранением
··#·· информации о владельце и пр.
··cp −a "$sourcedir" $dropbox
else
··# Исходный каталог отсутствует, поэтому переходим к отдельным файлам.
··if [! -d "$dropbox/$targetdir"]; then
····mkdir "$dropbox/$targetdir"
····if [$? -ne 0]; then
······echo "$name: Error encountered during mkdir $dropbox/$targetdir." >&2
······exit 1
····fi
··fi
··# Все готово! Скопировать указанные файлы.
··cp −p — v "$@" "$dropbox/$targetdir"
fi
# Теперь запустить приложение Dropbox, если необходимо, чтобы выполнить
#·· фактическую синхронизацию.
exec startdropbox −s
Большая часть листинга выполняет проверку на наличие ошибок, что очень утомительно, но необходимо, чтобы гарантировать правильную работу сценария и ничего не испортить. (Никто не хочет потерять свои данные!)
Выражения проверки имеют довольно сложный вид, как, например, в строке
. Данное выражение проверяет, имеется ли в папке Dropbox файл (что было бы странно) или каталог с именем в переменной $sourcedir. Дословно эта проверка читается так: «если существует-файл $dropbox/$sourcedir ИЛИ существует-каталог $dropbox/$sourcedir, тогда…».
В другой интересной строке вызывается команда cp
для копирования отдельных файлов. Желающие могут почитать страницу справочного руководства для команды cp (man cp), чтобы узнать, что значат использованные здесь флаги. На всякий случай напомним, что $@ — это краткая форма представления всех позиционных аргументов командной строки, переданных при вызове сценария.
Подобно многим сценариям из этой книги, данный сценарий можно запустить без аргументов, чтобы получить краткую инструкцию о порядке его использования, как показано в листинге 13.4.
Листинг 13.4.Вывод сценария syncdropbox с инструкцией о порядке его использования
$ syncdropbox
Usage: syncdropbox [-d source-folder] {file, file, file}
Результаты
Далее, как показано в листинге 13.5, мы выбрали файл и сохранили его в Dropbox.
Листинг 13.5.Синхронизация выбранного файла с хранилищем Dropbox
$ syncdropbox test.html
test.html — > /Users/taylor/Dropbox/sync/test.html
$
Довольно просто и удобно, если вспомнить, что тем самым вы делаете файлы или каталог с файлами доступными на других устройствах, где настроена ваша учетная запись в Dropbox.
Усовершенствование сценария
Когда выбранный каталог уже присутствует в папке Dropbox, наверное, было бы намного полезнее сравнить содержимое локального каталога и каталога в Dropbox, чем просто выводить сообщение об ошибке и завершать работу. Кроме того, когда определяется набор файлов, было бы полезно предусмотреть возможность указывать каталог назначения в иерархии файлов в Dropbox.
Читать дальше