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.


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).


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).


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.


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.


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.


Ł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ść.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.