Kopiuj pliki bez nadpisywania

99

Po prostu nie mogę znaleźć sposobu w linii poleceń, aby powiedzieć „skopiuj wszystkie pliki z katalogu A do katalogu B, ale jeśli plik już istnieje w katalogu B, nie nadpisuj go, bez względu na to, który plik jest nowszy i nie podpowiadaj mi ”.

Przeszedłem przez kopiowanie, przenoszenie, xcopy i robocopy, a jedyne co mogę uzyskać to to, że możesz powiedzieć robocopy „kopiuj A do B, ale nie nadpisuj nowszych plików starszymi”, ale to nie działa dla mnie . Spojrzałem na xxcopy, ale odrzuciłem go, ponieważ nie chcę mieć zależności innej firmy od zdarzenia po kompilacji programu Visual Studio, które będzie wymagało od innych użytkowników SVN zainstalowania tego narzędzia w celu wykonania kompilacji.

Chcę dodać wiersz polecenia do zdarzenia po kompilacji w programie Visual Studio 2010, aby pliki generowane z szablonów T4 dla nowych obiektów modelu EF były dystrybuowane do folderów projektu, do których należą, ale ponownie wygenerowane pliki dla istniejących obiektów nie nadpisuj potencjalnie edytowanych plików docelowych.

Ponieważ szablon T4 jest regenerowany, plik źródłowy jest zawsze nowszy i nie mogę niezawodnie użyć przełącznika „nowszy”, nie sądzę.

Używam klas częściowych dla tych elementów, dla których mogę, ale są inne rzeczy, które generuję, które nie mogą używać klas częściowych (np. Generowanie domyślnego pliku EditorTemplate lub DisplayTemplate * .ascx).

Czy ktoś ma podobne problemy, które rozwiązał?

Tony
źródło
Czy jesteś zaznajomiony z cmd.exe„s forpolecenia? Jeśli nie, polecam biegać for /?i używać tego.
Gabe

Odpowiedzi:

38
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
Stu
źródło
5
To zadziałało dla mnie, ale musiałem użyć symboli dwóch procent zamiast jednego, ponieważ uruchamiałem to z pliku wsadowego, a nie z wiersza poleceń. Zastąpiłem wystąpienia% F %% F, a wystąpienia% ~ nxF %% ~ nxF.
Owen
1
Czego ~nxsię %~nxFdokładnie na myśli?
Serge Rogatch
@stu, mówi tylko, że ~nxFzmienna Fzamienia się w nazwę pliku i rozszerzenie.
Serge Rogatch
Tak, więc efektywnie, podaj mi nazwę pliku + rozszerzenie, bez ścieżki - czyli to, czego potrzebujesz, aby wykonać test w folderze docelowym i określić docelową nazwę pliku. Chodzi o to, że% F zawiera ścieżkę i nie chcesz jej tam.
Stu
207

Robocopy , lub „Robust File Copy”, to polecenie replikacji katalogu wiersza polecenia. Był dostępny jako część zestawu Windows Resource Kit począwszy od systemu Windows NT 4.0 i został wprowadzony jako standardowa funkcja systemów Windows Vista, Windows 7 i Windows Server 2008.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

Aby rozwinąć (używając odpowiedzi Hydrargyrum, HailGallaxar i Andy Schmidt):

  • /E sprawia, że ​​Robocopy rekurencyjnie kopiuje podkatalogi, w tym puste.
  • /XCwyklucza istniejące pliki z tą samą sygnaturą czasową, ale różnymi rozmiarami plików. Robocopy normalnie je nadpisuje.
  • /XNwyklucza istniejące pliki nowsze niż kopia w katalogu docelowym. Robocopy normalnie je nadpisuje.
  • /XOwyklucza istniejące pliki starsze niż kopia w katalogu docelowym. Robocopy normalnie je nadpisuje.

Po wykluczeniu klas Changed, Older i Newer Robocopy robi dokładnie to, czego chce oryginalny plakat - bez konieczności ładowania środowiska skryptowego.

Źródła : Technet , Wikipedia Do
pobrania: łącze pobierania firmy Microsoft (ostatnio sprawdzono łącze 30 marca 2016 r.)

Dr Belisarius
źródło
Przez „wyklucz” masz na myśli „pomiń” czy „usuń / usuń”?
nalot
@Andre Terra: Normalnie pomiń. Jeśli używasz flagi / MIR, może je usunąć. Nie testowałem tego.
Hydrargyrum
W przypadku / MIR pliki, które nie istnieją w źródle, są rzeczywiście usuwane. Ale gdy używasz także / XN i / XO, pliki, które istnieją w obu miejscach, są po prostu pomijane (nie masz pewności, czy rozmiar jest zaznaczony). Jest to idealne rozwiązanie w mojej sytuacji, w której muszę skopiować nowszą lub starszą wersję mojej aplikacji, ale gdzie data Zmodyfikowane znaczki bibliotek używanych przez aplikację są nieprawidłowe, a same nazwy plików zawierają ich numer wersji.
Henno Vermeulen
Czy to konieczne /e? A jeśli /szamiast tego użyjesz ? Nie chcę wielu pustych podfolderów.
Arete
48

Rozwiązanie Belizariusza jest dobre.

Aby rozwinąć tę nieco zwięzłą odpowiedź:

  • /E sprawia, że ​​Robocopy rekurencyjnie kopiuje podkatalogi, w tym puste.
  • /XCwyklucza istniejące pliki z tą samą sygnaturą czasową, ale różnymi rozmiarami plików. Robocopy normalnie je nadpisuje.
  • /XNwyklucza istniejące pliki nowsze niż kopia w katalogu źródłowym. Robocopy normalnie je nadpisuje.
  • /XOwyklucza istniejące pliki starsze niż kopia w katalogu źródłowym. Robocopy normalnie je nadpisuje.

Po wykluczeniu klas Changed, Older i Newer Robocopy robi dokładnie to, czego chce oryginalny plakat - bez konieczności ładowania środowiska skryptowego.

Hydrargyrum
źródło
46

Możesz spróbować tego:

echo n | copy /-y <SOURCE> <DESTINATION>

-ypo prostu wyświetla monity przed nadpisaniem i możemy przesłać n do wszystkich tych pytań. Więc w zasadzie wystarczyłoby to skopiować nieistniejące pliki. :)

sachin11
źródło
2
Pięknie proste.
Holf
6
dlaczego odpowiada na wszystkie pytania, skoro tylko raz potykamy?
phuclv
Super, wybrałem tę opcję. Zanim pomyślałem o orurowaniu, wyszukałem w Google parametr, o którym myślałem, że brakuje, a potem trafiłem na tę stronę. Próbując tego rozwiązania zauważyłem, że podczas pipingu kopiowanie najwyraźniej włącza parametr / Y, dlatego należy dodać / -Y.
Andrew,
2
@phuclv Wydaje się, copy /-yże automatycznie zakłada się, że nie, gdy w stdin zabraknie danych wejściowych. Możesz pominąć pierwszą jawną nlub przeliczyć < nulna nią potok i to samo się stanie.
mwfearnley
6

Tutaj jest w postaci pliku wsadowego:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
Gabe
źródło
3

Chcę tylko wyjaśnić coś z moich własnych testów.

@Hydrargyrum napisał:

  • / XN wyklucza istniejące pliki nowsze niż kopia w katalogu źródłowym. Robocopy normalnie je nadpisuje.
  • / XO wyklucza istniejące pliki starsze niż kopia w katalogu źródłowym. Robocopy normalnie je nadpisuje.

To faktycznie jest wstecz. XN wykonuje „wykluczaj nowsze” pliki, ale wyklucza pliki nowsze niż kopia w katalogu docelowym . XO wykonuje „Wyklucz starsze”, ale wyklucza pliki starsze niż kopia w katalogu docelowym .

Oczywiście zrób własne testy, jak zawsze.

HailGallaxar
źródło
1
Czy to odpowiedź na pierwotne pytanie, czy komentarz do odpowiedzi innej osoby?
ASGM
1
Czy odpowiedź Hydrargyrum ma +25 głosów w momencie pisania odpowiedzi na oryginalne pytanie, czy komentarz do odpowiedzi innej osoby?
pon.
3

Jest na to dziwny sposób z xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Po prostu dołącz tyle n, ile plików, które kopiujesz, a to odpowie n na wszystkie nadpisane pytania.

Adam mówi - Przywróć Monikę
źródło
Odnośnie copy, zobacz tę odpowiedź , a konkretnie komentarz @mwfearnley: copy /-yautomatycznie zakłada, że npo wyczerpaniu stdin możesz np. echo nTylko raz i nadal działa.
rsenna
3
robocopy src dst /MIR /XX

/ XX: eXclude „eXtra” pliki i katalogi (obecne w miejscu docelowym, ale nie w źródle). Zapobiegnie to usunięciu z miejsca docelowego. (to jest ustawienie domyślne)

be_good_do_good
źródło
1

Robocopy można pobrać tutaj dla systemów, w których nie jest jeszcze zainstalowany. (Tj. Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (do instalacji nie jest wymagane ponowne uruchomienie)

Pamiętaj, aby ustawić swoją ścieżkę do pliku robocopy exe. Aby to zrobić, kliknij prawym przyciskiem myszy "mój komputer"> właściwości> zaawansowane> "Zmienne środowiskowe", a następnie znajdź zmienną systemową ścieżki i dodaj ją na końcu: "; C: \ Program Files \ Windows Resource Kits \ Tools" lub gdziekolwiek zainstalowałem go. Pamiętaj, aby zostawić ciągi zmiennych ścieżki, które już tam istnieją, i po prostu dołączyć dodatkową ścieżkę.

Po ustawieniu ścieżki możesz uruchomić polecenie sugerowane przez belizariusza. Działa świetnie.

Greg
źródło
1

Nie pozwoli mi bezpośrednio komentować niepoprawnych wiadomości - ale pozwól mi tylko ostrzec wszystkich, że definicje opcji / XN i / XO są ODWRÓCONE w porównaniu z tym, co zostało opublikowane w poprzednich wiadomościach.

Opcja Wyklucz starsze / nowsze pliki jest zgodna z informacjami wyświetlanymi w dzienniku RoboCopy: RoboCopy będzie iterować przez ŹRÓDŁO, a następnie raportować, czy każdy plik w ŹRÓDŁU jest „STARSZY” lub „NOWSZY” niż plik w miejscu docelowym.

W konsekwencji / XO wykluczy pliki STARSZE ŹRÓDŁO (co jest intuicyjne), nie „starsze od źródła”, jak zostało to tutaj stwierdzone.

Jeśli chcesz skopiować tylko nowe lub zmienione pliki źródłowe, ale uniknąć zastępowania nowszych plików docelowych, to / XO jest właściwą opcją do użycia.

Andy Schmidt
źródło
0

Prostym podejściem byłoby użycie opcji / MIR, aby odzwierciedlić dwa katalogi. Zasadniczo skopiuje tylko nowe pliki do miejsca docelowego. W następnym poleceniu zastąp źródło i miejsce docelowe ścieżkami do twoich folderów, skrypt wyszuka dowolny plik z dowolnymi rozszerzeniami.

robocopy <source directory> <destination directory> *.* /MIR
Ionut V.
źródło
0

To właśnie zadziałało dla mnie. Używam tego do „dodawania” plików na inny dysk, bez nadpisywania.

Plik wsadowy: robocopy-missingfiles.bat

@echo off
echo Copying 
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

Przykład:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

Wykonaj test przed wdrożeniem.

Ramesh
źródło