Выражения проверки имеют довольно сложный вид, как, например, в строке . Данное выражение проверяет, имеется ли в папке 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.
Первые два сценария в этой главе довольно легко можно адаптировать для использования службы Microsoft OneDrive или Apple iCloud, так как они имеют ту же основную функциональность. Главное отличие заключается в соглашении об именовании и местоположении каталогов. И да, не забудьте, что OneDrive в одних контекстах имеет имя OneDrive (например, приложение, которое требуется запустить), а в других — имя SkyDrive (каталог в вашем домашнем каталоге). Однако все это легко поддается управлению.
№ 91. Создание слайд-шоу из фотопотока в облаке
Некоторые с удовольствием пользуются службой Photo Stream в iCloud, тогда как других раздражает ее стремление сохранить копии всех снимков, даже бросовых, сделанных мобильным устройством. Тем не менее возможность хранить фотографии в понравившейся облачной службе резервного копирования привлекает многих. Проблема, однако, в том, что эти файлы обычно скрыты — они глубоко зарыты в вашей файловой системе и не могут автоматически выбираться многими программами, показывающими слайд-шоу из фотографий.
Мы исправим эту ситуацию с помощью slideshow, простого сценария (представленного в листинге 13.6), который проверяет папку выгрузки фотографий, сделанных камерой, и отображает файлы, находящиеся в ней, уменьшая их до определенных размеров. Для достижения желаемого результата можно использовать утилиту display, входящую в состав ImageMagick (пакета мощных утилит, с которыми мы будем знакомиться в следующей главе). Пользователи OS X легко могут установить ImageMagick с помощью диспетчера пакетов brew:
$ brew install imagemagick −with-x11
Несколько лет назад компания Apple прекратила распространение X11, популярной графической библиотеки для Linux и BSD, со своей операционной системой. Чтобы использовать сценарий slideshow в OS X, в системе должен присутствовать пакет ImageMagick с библиотеками X11 и необходимыми для них ресурсами, для чего достаточно установить пакет XQuartz. Дополнительную информацию о пакете XQuartz и инструкции по его установке можно найти на официальном веб-сайте: https://www.xquartz.org/.
Код
Листинг 13.6. Сценарий slideshow
··#!/bin/bash
··# slideshow — показывает слайд-шоу из фотографий, находящихся в указанном
··#·· каталоге. Использует утилиту "display" из пакета ImageMagick.