2010-04-26 3 views
2

У меня есть резервный каталог, созданный WDBackup (западный цифровой внешний HD-архив), который содержит каталог для каждого дня, который он резервировал, и инкрементное содержимое только того, что было скопировано.В терминале слияние нескольких папок в один

Так иерархия выглядит следующим образом:

20100101 
    My Documents 
    Letter1.doc 
    My Music 
    Best Songs Every 
     First Songs.mp3 
    My song.mp3 # modified 20100101 
20100102 
    My Documents 
    Important Docs 
     Taxes.doc 
    My Music 
    My Song.mp3 # modified 20100102 

...etc... 

Только что изменилось резервное копирование и первая резервная копия, которая была когда-либо сделала содержит все файлы, выбранные для резервного копирования.

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

В качестве примера, если только с помощью этих двух примеров папки, окончательный объединенный каталог будет выглядеть следующим образом:

Merged 
    My Documents 
    Important Docs 
     Taxes.doc 
    Letter1.doc 
    My Music 
    Best Songs Every 
     First Songs.mp3 
    My Song.mp3 # modified 20100102 

Надежда, которая имеет смысл.

Спасибо,

Джош

ответ

5

Вы можете использовать Rsync в Баш для цикла, например:

$ for d in 2010* ; do rsync -av ./$d/ ./Merged/ ; done 

Обратите внимание, что перед запуском этого по-настоящему, вы можете просто хотите быть осторожным и тест что он действительно будет делать то, что вы хотите, - для этого вы можете использовать флаг rsync -n для выполнения «сухого хода»:

$ for d in 2010* ; do rsync -avn ./$d/ ./Merged/ ; done 
+1

У меня есть ПИТАНИЕ! Спасибо, человек. Пятно на. Почти страшно, насколько это элегантно. –

1

Если имена каталогов действительно находятся в форме YYYYMMDD, вы можете просто отсортировать их. Так что это всего лишь вопрос прохождения их по одному от старшего и копирование всего в пункт назначения, переписывание предыдущих вещей. Довольно неэффективно, но работает.

cd $my_disk_full_of_backups 
for x in (ls | sort); do cp -Rf $x/* /my_destination/; done 

Уродливый, как есть, также должен быть достаточно переносимым практически для каждой системы unix, у которой есть bash.

См. Bash (1), ls (1) и сортировать (1) для деталей.

+1

Креатив точно. Paul's rsync просто делает его более чистым. Благодарю. –

+2

Он избил меня примерно на 40 секунд :) Серьезно: решение Павла основывается на сортировке по алфавиту (по расширению имени пула оболочки), и это, вероятно, то, что вы хотите, я привык к сортировке, потому что мне слишком часто нужна численная сортировка (сортировка - п). Вам также нужен rsync, которого нет в каждой каждой системе. (FreeBSD не имел его в стандартной установке, не знаю в наши дни). – Luke404