Czy lepiej jest zawsze kopiować i usuwać niż przenosić?

18

Ogólnie rzecz biorąc, wpadam w panikę, kiedy zdaję sobie sprawę, że jeśli anuluję przeniesienie pliku, może to spowodować niekompletność obiektu docelowego lub źródła. To pytanie dotyczy platform Windows i Unix. W obu przypadkach nigdy nie pamiętam dokładnie, jak działa polecenie przenoszenia. Na przykład, jeśli przenosisz katalog; czy kopiuje cały katalog, a następnie usuwa go później, czy też kopiuje, a następnie usuwa każdy plik osobno?

Zawsze zdaję sobie sprawę, po wpisaniu czegoś takiego mv verybigdir dest, że być może powinienem był napisać cp -R verybigdir dest  &&  rm -R verybigdir(gdzie &&operator przechodzi do następnego polecenia tylko wtedy, gdy pierwsze z nich zakończyło się powodzeniem) - czy to nie ma sensu? Co się dokładnie dzieje, kiedy naciskam Ctrl+ w Cpołowie ruchu? Podobnie, co dokładnie dzieje się w systemie Windows po naciśnięciu przycisku Anuluj?

Nie mogę policzyć, ile razy coś przeniosłem (ostatnim razem, gdy korzystałem svn) i miałem dwa katalogi z podzieloną zawartością. Myślę, że odpowiedź jest trudna, ponieważ nie wszystkie aplikacje przenoszą grupy plików w ten sam sposób.

Nick Bolton
źródło
16
Cokolwiek zrobisz, nie usuwaj najpierw.
mtone
@monotone Hilarious +1
Nick Bolton

Odpowiedzi:

10

W systemie Windows przejście na ten sam dysk i partycję będzie działać tak samo, jak polecenie mv Unixa, zmiana nazwy folderu lub zmiana jego rodzica. Jeśli jednak przeniesiesz go na inny sterownik lub partycję, skopiuje i usunie plik po pliku, dlatego bardziej efektywne jest użycie pliku tar lub zip bez kompresji, aby szybciej przenosić pliki między partycjami i dyskami twardymi . Jeśli go anulujesz, po prostu zatrzyma się na swoim miejscu. Sądzę, że to samo dotyczy Uniksa, ale nie eksperymentowałem z nim wystarczająco, aby mieć 100% pewności. To tylko kwestia zmiany i-węzła, ale jeśli znajduje się on na innej partycji lub dysku, należy go skopiować do sektorów na tej partycji lub dysku. Jeśli anulujesz go podczas przesyłania, przeniesie on już niektóre pliki, a plik, który był przesyłany, zobaczy to „

Aktualizacja: Jeśli chcesz anulować ruch i chcesz go wznowić, po prostu ponownie wydaj polecenie przeniesienia. Może to ostrzec, że folder docelowy już istnieje, ale pliki nie zostaną nadpisane (chyba że istniały przed pierwotnym przeniesieniem lub nie zostały dodane między dwoma zleceniami przeniesienia), ponieważ zaraz po ich przeniesieniu są usuwane z źródło (jeśli jest na innej partycji lub dysku).

Wilk
źródło
Ach, nie myślałem o kompresji.
Nick Bolton
Naprawdę nie trzeba kompresować, co może zająć dużo czasu. Czasami poziom kompresji 0 (pamięć masowa) może znacznie przyspieszyć przenoszenie dużych folderów między dyskami.
Wolf
„W systemie Windows przejście na ten sam dysk i partycję będzie działać tak samo, jak polecenie mv Uniksa i zmieni nazwę folderu lub zmieni jego rodzic”. - Podczas korzystania z Eksploratora Windows to nieprawda. Robi dużo bzdur, zajmuje wieki i możesz skończyć z treścią podzieloną na dwa katalogi, zobacz tę odpowiedź na moje pytanie .
maaartinus,
@maaartinus W rzeczywistości sposób Eksploratora Windows polega na tym, że kopie rekurencyjnie w folderach, zamiast zmieniać węzeł nadrzędny. Masz rację w przypadku Eksploratora Windows, nie jest to tylko ruch atomowy. Zakładałem, że używana jest linia poleceń, powinienem był zapytać.
Wolf
11

Nawet na idealnie stabilnym komputerze, który nigdy nie zawodzi: jeśli zależy Ci na znacznikach czasu, to mvjest lepszy niż zwykły cp.

( cp -azachowa dla ciebie znaczniki czasu i zakładam, że coś podobnego istnieje w systemie Windows).

Arjan
źródło
1
Aha, znaczniki czasu. Nie zastanawiałem się nad tym! +1
Nick Bolton
Czy znaczniki czasu są nawet ważne szczerze ...
Marcin
1
@Marcin, są tam z jakiegoś powodu, jeśli o to pytasz ...
Macek
10

Nie.

Wyjaśnienie:

mv verybigdir dest

zmienia nazwę verybigdir na dest. Jest to operacja atomowa, tzn. Nie może zawieść w połowie.

Jeśli dest jest na innym urządzeniu, mv najpierw skopiuje, a następnie usunie starą wersję. To nie jest operacja atomowa. Jeśli się nie powiedzie, możesz mieć tylko częściową kopię verybigdir w dest, ale verybigdir nadal będzie kompletna.

Tak, inne aplikacje mogą przenosić pliki inaczej.

Timo Stamm
źródło
2
Właściwie myślę, że mv na Linuksie kopiuje / usuwa każdy plik lub katalog osobno, zamiast kopiowania całego drzewa do miejsca docelowego, a następnie usuwania całego drzewa ze źródła ... więc jeśli anulujesz w połowie, skończysz z pewnym pliki w obu miejscach i żaden katalog nie będzie kompletny.
okradać
3
@rob: Nie. Katalogi są plikami jak każdy inny i są traktowane w ten sam sposób. Zachowanie, o którym mówisz, zostało osiągnięte mv verybigdir/* dest.
dmckee,
2
Zasadniczo mv obsługuje każdy argument w sposób „cp && rm” ... mv verybigdir/* destdzieli mv z verybigdir na wiele oddzielnych operacji przenoszenia. Zawsze pamiętaj, że w przeciwieństwie do systemu Windows, program / narzędzie Linux nie widzi tam „*”, jest rozszerzane przez powłokę.
Jürgen A. Erhard
4

W systemie Windows zawsze kopiuję i usuwam zamiast przenosić. Kiedyś przenosiłem pliki i tutaj po raz pierwszy zauważyłem zły patyk pamięci. Podczas przenoszenia pliku zatrzymał się pomiędzy i dostałem błąd, więc sprawdziłem folder źródłowy i plik zniknął, a następnie sprawdziłem miejsce docelowe i był uszkodzony plik. Zdarza się to częściej w przypadku plików o większym rozmiarze, a większość z nich to pobieranie, które trwało godziny, więc zalecam kopiowanie, a następnie usuwanie. Zaoszczędź czas na początku, to się w końcu opłaci.

w.
źródło
3

W unixie, w ruchach, które nie przekraczają granic systemu plików, mvnie kopiuje danych: po prostu aktualizuje bazę danych i-węzłów w różnych katalogach. Jest to znacznie szybsze niż cpw przypadku dużych plików.

Co więcej, używanie mvponad granicami systemu plików po prostu dyskretnie wywołuje mechanizm kopiowania i usuwania.

Więc myślę, że powinieneś mv.

dmckee
źródło
Ładnie podsumowane.
Nick Bolton,
„mechanizm kopiowania i usuwania” można interpretować jako „skopiuj każdy plik, a następnie usuń go” lub „skopiuj wszystkie pliki, a następnie usuń wszystkie”.
j_random_hacker
2

Przynajmniej w systemie Windows ruch jest po prostu bardziej zautomatyzowanym kopiowaniem i usuwaniem. Wierzę, że mv przenosi każdy plik osobno, co oznacza, że ​​^ c-ing nie straci żadnych plików, po prostu skończysz z plikami podzielonymi na dwa miejsca - w przeciwieństwie do Eksploratora Windows, który usunie wszystko po anulowaniu.

Moje rozwiązanie tego: nigdy się nie ruszaj, chyba że jestem pewien, że chcę to przenieść.

Phoshi
źródło
1

Jeśli używasz list ACL w źródłowym systemie plików, ale nie w miejscu docelowym, mv w systemie Linux skopiuje źródło, a następnie - z powodu niemożności ustawienia list ACL w miejscu docelowym - zatrzyma się. W rezultacie plik ma po obu stronach. Nie ma przełącznika w mv, aby temu zapobiec, więc w tym przypadku preferowane są cp && rm.

uli42
źródło