2014-02-09 2 views
0

У меня есть сценарий резервного копирования, использующий rsync для синхронизации исходной и целевой папки. Ну, это довольно прямолинейно и не требует 180 строк bash. Проблема в том, что я хочу, чтобы все измененные/удаленные файлы и каталоги в источнике были скопированы из места назначения в безопасное место до синхронизации синхронизирующих каталогов rsync.Список самых префиксов нескольких префикс каталога

Я использую аргумент rsync --delete, потому что, я хочу, чтобы синхронизация папок, просто я также хочу создать резервную копию удаленных и измененных файлов и папок. rsync перечисляет все удаленные файлы и папки, даже если файлы включены в удаленную папку. Выходной сигнал rsync выглядит так:

sending incremental file list 
.d..t......|Original/Artist/ 
*deleting |Original/Artist/nymapp/skitfil.mp3 
*deleting |Original/Artist/nymapp/ 
sent 416.81K bytes received 732 bytes 25.30K bytes/sec 
total size is 89.97G speedup is 215480.91 (DRY RUN) 

Здесь перечислены как удаленный файл, так и удаленная папка. Если вы просто скопируете все справа от символа «|», который начинается с «* удаления», вы закончите копирование файлов в удаленные папки, когда вы уже скопировали папку и ее содержимое. Или наоборот, в зависимости от того, какая запись указана первыми в выводе rsync. В случае копирования файла в папку, которая не существует, cp просто выйдет с кодом ошибки, если папка назначения не существует. Поэтому лучше всего скопировать все удаленные папки, а затем проверить, включены ли удаленные файлы в удаленные папки.

В основном я хочу список всех «родительских» папок следующего примера списка файлов и папок:

*deleting |/Original/Artist/HDLC/fake.mp3 
*deleting |/Original/Various/blabla.mp3 
*deleting |/Original/Artist/Dir_en_grey/duh.mp3 
*deleting |/Original/Artist/Dir_en_grey/ 
*deleting |/Original/Artist/Dir_en_grey/dir1/dir2/dir1/ 
*deleting |/Non\ Original/hey.mp3 
*deleting |/Non\ Original/Electronic/bla.mp3 
*deleting |/Non\ Original/Electronic/dir2/ 
*deleting |/Non\ Original/Synth/meh.mp3 
*deleting |/differentparent/nofile.mp3 

Вывод должен быть:

/Original/Artist/HDLC/ 
/Original/Various/ 
/Original/Artist/Dir_en_grey/ 
/Non\ Original/ 
/Non\ Original/Electronic/ 
/Non\ Original/Synth/ 
/differentparent/ 

Причина, по которой это недостаточно просто скопировать удаленные папки и пропустить часть файлов, так как удаленные и измененные файлы, которые находятся в папках, которые не были удалены, должны быть скопированы в безопасное место, и вы не хотите копировать целую папку только потому, что один файл в нем был удален.

Как вы видите, это сложнее, чем кажется на первый взгляд. Есть ли дружеская душа, которая может представить мне набор команд, которые найдут эти «родительские» каталоги или, возможно, другое решение проблемы.

+0

Вопрос немного запутанный для меня. Если вы просто пытаетесь перейти от списка файлов и папок к выходу, то можете объяснить немного больше о правилах. например непонятно, почему '/ Original/Artist/Dir_en_grey/dir1/dir2 /' не должны выводиться? – BroSlow

+0

Это связано с тем, что rsync обнаружил, что вся папка **/Original/Artist/Dir_en_grey/** была удалена и, следовательно, включена подпапка ** dir1/dir2/dir1/** и уже скопирована, когда cp скопировал содержимое/Оригинал/Исполнитель/Dir_en_grey в безопасное место. Как вы видите на выходе rsync, только две папки были удалены вместе с содержимым, будь то файлы или папки или без содержимого: '* удаление// Оригинал/Исполнитель/Dir_en_grey /' '* удаление// Не \ Оригинал/Электронный/dir2/' – Nikken

+0

Нет предложений ..? Кто угодно :) – Nikken

ответ

0

Решение было встроенными функциями --backup и --backup-dir = in rsync. --backup делает то, что он вызывается и используется вместе с --backup-dir, который перемещает резервные копии файлов в безопасное место, и проблема была решена.

Смежные вопросы