Rekursywna, nie nadpisująca kopia pliku?

21

Mam katalog zawierający kilka innych folderów zawierających pliki CoffeeScript / JavaScript. Jestem w stanie skompilować pliki CoffeeScript do nowego folderu o tej samej strukturze folderów.

Chcę tylko skopiować rekursywnie wszystkie pliki * .js z folderu źródłowego do folderu docelowego. Nie chcę również zastępować żadnych plików, które są już obecne w folderze docelowym. Jakieś myśli o tym, jak to osiągnąć?

Próbowałem użyć cp -n source/**.js desination/i cp -Rn source/**.js desination/po spojrzeniu na inne podobne pytanie, ale wydaje się, że nie działa.

Masz pomysł, jak to osiągnąć?

AlbertEngelB
źródło
Czy zajrzałeś do rsync?
bonob
@bonob Nie nie mam. Użyłem go raz lub dwa razy, ale tylko do zdalnego pobierania plików.
AlbertEngelB

Odpowiedzi:

25

Możesz użyć rsync (robi to również lokalną kopię)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r powracać do katalogów,
  • --ignore-existing zignorować istniejące pliki w miejscu docelowym,
  • includei excludefiltruje średni: obejmuje wszystkie katalogi, obejmują wszystkie * .js, wykluczyć resztę; potrzebne jest pierwsze dołączenie, w przeciwnym razie ostatnie wykluczenie spowoduje także wykluczenie katalogów przed skanowaniem ich zawartości.

Na koniec możesz dodać „ -Pjeśli chcesz oglądać postępy”, „ --list-onlyjeśli chcesz zobaczyć, co by skopiował bez faktycznego kopiowania”, a -tjeśli chcesz zachować znaczniki czasu.


Nie jest to powiązane, ale ostatnio nauczyłem się polecenia rsync, kiedy przenosiłem 15 lat dokumentów z jednej partycji na drugą. Przekonany, że moje pliki tam są, wyczyściłem starą partycję i włożyłem tam trochę innych rzeczy; Później zdałem sobie sprawę, że straciłem wszystkie znaczniki czasu i odkryłem flagę -t. Chciałem tylko podzielić się moim cierpieniem: ”(

bonob
źródło
Haha, ten zadziałał! rsyncnajwyraźniej to bomba.
AlbertEngelB
3
Tak, ledwo o tym wiem, ale po prostu wiele się nauczyłem, próbując odpowiedzieć na twoje pytanie. Jeśli chcesz pójść dalej w przyszłości, możesz zdefiniować złożone filtry w plikach i wywołać je na przykład w poleceniu. Możesz także mieć filtry dla poszczególnych katalogów, kompresować dane podczas kopiowania, a to tylko drapanie po powierzchni!
bonob
7

Można to również osiągnąć za pomocą cp. Spójrz tutaj:

sudo cp -vnpr /xxx/* /yyy

xxx = źródło

rrr = miejsce docelowe

v = pełny

n = bez clobber (bez nadpisywania)

p = zachowaj uprawnienia

r = rekurencyjny

SEMbyotic
źródło
5

Patrząc na strony podręcznika, wydaje się, że chcesz tę -nopcję.

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)
tantal
źródło
Próbowałem użyć opcji -n, ale nie pozwala mi to filtrować według plików * .js.
AlbertEngelB
0

Moja dystrybucja nie miała dostępnego Clobbera, więc:

echo n | cp -vipr xxx yyy

xxx = źródło

rrr = miejsce docelowe

v = pełny

i = interaktywny (monit o zastąpienie) | dlatego polecenie poprzedzone jest „echo n |”

p = zachowaj uprawnienia

r = rekurencyjny

Oktawian
źródło