Mam dwie kopie folderu
src/
dest/
Chcę je scalić, wykonując następujące czynności:
Jeśli plik jest tylko w src
środku, chcę go przenieśćdest
Jeśli plik jest tylko w dest
środku, chcę, aby IE go zignorował.
Jeśli plik jest w obu i ma identyczną zawartość (IE tego samego rozmiaru i daty), usuń zsrc
Jeśli plik znajduje się w obu i nie ma identycznej zawartości, pozostaw je, src
aby móc je ręcznie scalić.
Tylko bardzo mała liczba plików (od 0% do 5% wszystkich plików) powinna należeć do tej ostatniej kategorii, ale nie wiem, jak oddzielić oba w jednym i tym samym od obu, ale różne.
Próbowałem dowiedzieć się, jak to zrobić, rsync
ale jak dotąd bezskutecznie.
for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done
(możesz pominąć,|| echo $file
jeśli chcesz, jest to uwzględnione dla kompletności)\?*[
, inicjał-
). Musisz używać podwójnych cudzysłowów wokół podstawień zmiennych , przechodzić--
do narzędzi przed nazwami plików,find … -exec …
zamiast analizować wynikfind
. Zrm
poleceniem w miksie jest to przepis na katastrofę.unison to narzędzie, którego szukasz. Spróbuj unison-gtk, jeśli wolisz GUI. Ale nie sądzę, że usunie podobne pliki: zgodnie staraj się, aby oba katalogi były identyczne. Niemniej jednak łatwo 1) zidentyfikuje pliki do skopiowania; 2) które wymagają ręcznego scalenia.
źródło
Poniższy skrypt powinien działać rozsądnie. Przenosi pliki ze źródła do miejsca docelowego, nigdy nie nadpisując pliku i tworząc katalogi w razie potrzeby. Pliki źródłowe, które mają odpowiadający inny plik w miejscu docelowym, zostają pozostawione same, podobnie jak pliki, które nie są zwykłymi plikami lub katalogami (np. Dowiązania symboliczne). Pliki pozostałe w źródle to te, w przypadku których występuje konflikt. Uwaga, wcale tego nie testowałem.
Innym podejściem byłoby zrobienie montowania unii jeden katalog nad drugim, na przykład z funionfs lub unionfs -fuse .
źródło