Синхронизация файлов в смешаной сети NFS (Linux) и SAMBA (Windows)

Что ни говори, а все-таки по сети нет-нет, да и приходится взаимодействовать с компьютерами под управлением Windows. Некоторое время назад, я установил себе мультимедиаплеер с поддержкой WiFi и с встроенным диском на два терабайта. В общем, вздумалось мне, что негоже прозябать такому вместительному хранилищу и решил слить туда медиафайлы с остальных компов, а в дальнейшем периодически синхронизировать медиаданные между компами и плеером. В самом девайсе зашито ядро драгоценного Linux, но к сети он подключается под виндовым протоколом через samba. Соответственно для нормальной работы с устройством (я говорю именно про нормальную работу, т. е. не через GUI и всякие копи-пасты..), для начала необходимо примонтировать диск плеера в какой-нибудь локальный каталог. Делается это следующей строкой:

sudo mount -t cifs -o iocharset=utf8,file_mode=0777,dir_mode=0777,uid=1000 //192.168.1.34/ScreenPlay ~/Share

где:

uid=1000 - это uid пользователя с правами которого нужно примонтировать диск (по умолчанию, если не указать нужный uid, все права на файлы и директории будут принадлежать пользователю root, так-как сама команда выполнялась от суперпользователя, через sudo).

//192.168.1.34/ScreenPlay - это сетевой ip адрес устройства и каталога, который станем монтировать.

~/Share - это предварительно созданный каталог куда хотим монтировать своё устройство.

Опции iocharset=utf8, file_mode=0777, dir_mode=0777 (в строке идут через запятую, без пробелов) говорят сами за себя - это кодировка ( utf8 ) и права на файлы и папки ( 0777 ).

rsync -avn /home/barbar/Media/ /home/barbar/Share/RemoteMedia/ (опция -n позволяет увидеть предстоящие изменения, без запуска самой синхронизации)

rsync -av /home/barbar/Media/ /home/barbar/Share/RemoteMedia/ (запуск синхронизации)

Команда rsync имеет полезную опцию –progress, устанавливая её вы сможете наблюдать за процессом происходящего. Это весьма полезно при синхронизации больших файлов, когда может показаться, что команда «зависла», а учитывая, что при синхронизации с удаленным диском, могут возникать обрывы сети и прочие непредвиденные ситуации, наблюдение за прогрессом оказывается отнюдь не лишним. Однако, команду rsync, часто запускают в фоновом режиме, и тогда следить за статусом выполнения становится неудобно. В этом случае, можно периодически, в целевой папке, куда пишем информацию, запускать что-нибудь на подобии:

ls -la .?*? | cut -d\ -f5

Обратите внимание, что регулярное выражение {.?*?} подходит для слежения за обычными файлами, имена которых не начинаются с точки. В иных случаях регулярные выражения, можно составлять исходя из ситуации. Например, для слежения за видео файлами с расширением «avi» можно использовать следующее выражение в строке:

ls -la .?*.avi.* | cut -d\ -f5

Так-как формат временного названия синхронизируемого файла, rsync генерирует по шаблону типа - «.00017.avi.zZIAQP», т. е. добавляет точку перед названием и в конце, а затем добивает рендомным буквосочетанием из 6-ти произвольных символов, то выражение «.?*.avi.*» вполне подойдет для того, чтобы команда ls -ls выдала нам информацию именно о том файле, который находится в процессе синхронизации. Далее, после знака вертикальной черты («|» - конвеер) мы передаём найденную строку команде cut, которая получая данные о нужно поле (в данном случае, мне интересен лишь размер обрабатываемого файла, если он меняется, то все нормально — синхронизация в процессе работы), через опции - «-d\ » (d — делиметр, а «\ » - обозначение пробела, (который мы передавая как разделитель строки, должны предварять (экранировать) обратным слэшем, иначе пробел будет воспринят как служебный символ и команда его просто не воспримет, выдав сообщение типа - «cut: разделитель должен быть одним символом…») т.е. мы сообщаем, что поля в строке разделены символом «пробел») и опцию «-f5» (пятое поле полученной строки) выдает нам размер обрабатываемого файла.


Перекодировка и склейка множества видеофайлов MTS (AVCHD) в DVD формат AVI

Одной строкой:

for invideo in `find -name ‘*.MTS’`; do ffmpeg -i $invideo -deinterlace -target pal-dvd Converted/${invideo%%.MTS}.avi; done; mencoder -ovc copy -oac copy -o Converted/outvideo.avi Converted/*.avi

Эта строка содержит несколько идущих подряд команд:

1) for invideo in `find -name ‘*.MTS’`; (находим в папке все файлы с расширением MTS)

2) do ffmpeg -i $invideo -deinterlace -target pal-dvd Converted/${invideo%%.MTS}.avi; (поочердно, конвертируем найденые файлы в формат “avi” и сохраняем в папкe “Converted” с прежним названием но с расширением “avi”)

3) done; (завершаем цикл конвертирования файлов из “MTS” (”AVCHD”) в “AVI”)

4) mencoder -ovc copy -oac copy -o Converted/outvideo.avi Converted/*.avi (исользуя “mencoder” в папке “Converted” склеиваем все файлы с расширением “avi” в новый файл “outvideo.avi”)

Как всегда, командная строка радует своей простотой и изящностью :)