Skopiuj pliki, które nie istnieją w wyższym katalogu

0

Obecnie wiem jak skopiować pliki, które nie istnieją w katalogu docelowym. To pozwala mi kopiować z src do dst tak jak bym chciał.

Jednak teraz chcę skopiować z src do dst/2016-01-05 ALE tylko pliki w src które nie istnieją nigdzie w środku dst.

Przykład

Załóżmy, że sytuacja początkowa jest

src/f1.txt
src/f2.txt
src/f3.txt

dst/2016-01-04/f1.txt
dst/2016-01-05/f0.txt

Następnie, po wykonaniu kopii, sytuacja końcowa powinna być:

src/f1.txt
src/f2.txt
src/f3.txt

dst/2016-01-04/f1.txt
dst/2016-01-05/f0.txt

dst/2016-01-05/f2.txt
dst/2016-01-05/f3.txt

Ogólnie nie chciałbym nadpisywać istniejących plików. Nawet jeśli źródło zostanie zaktualizowane.

Dennis Jaheruddin
źródło
Czy istnieją podkatalogi src/? Jeśli tak, w jaki sposób są obsługiwane dst/? Czy katalog z kodem daty jest natychmiast pod dst/ lub między katalogiem źródłowym a plikiem docelowym?
AFH
@AFH Nie ma podkatalogów w src. w dst katalog, utworzę folder z aktualną datą, na przykład dst/2016-01-04i umieść tam wszystkie pliki, które nie istniały w dowolnym miejscu dst jeszcze. (Nie chcę polegać na tym, jak długo trwały pliki src )
Dennis Jaheruddin

Odpowiedzi:

1

Następujące czynności powinny załatwić sprawę: -

today=`date +%Y-%m-%d`
ls -A src/ | while f=`line`; do if [ ! -f "dst/*/$f" ]; \
                 then mkdir -p "dst/$today"; cp "src/$f" "dst/$today/$f"; fi; done

Uwagi: -

  1. W porównaniu z alternatywą for f in src/*; ..., za pomocą ls usuwa katalog z nazwy źródła i -A zawiera nazwy plików zaczynające się od .,.
  2. Jeśli istnieją podkatalogi src/ musisz użyć find w katalogu źródłowym i pasku src/ od nazwy z -printf %P\\n.
  3. Jeśli nie masz line polecenie, którego możesz użyć while read f; ..., ale to nie działa w przypadku nazw plików z białą i końcową spacją (nawet line kończy się niepowodzeniem, jeśli nazwa pliku zawiera znak nowej linii - do tego trzeba użyć find -print0 i xargs -0 ).
AFH
źródło