Co robi mv w przypadku błędów?

18

Właśnie próbowałem przenieść duże drzewo z jednego dysku na drugi, które było zbyt małe. Teraz pozostaje mi coś, czego tak naprawdę nie rozumiem - wygląda na to, że niektóre pliki zostały rzeczywiście przeniesione z drzewa źródłowego, podczas gdy inne zostały właśnie skopiowane. Najprawdopodobniej nie jest to prawdą i po prostu coś przeoczam, tak jak to zrobiłem, kiedy sprawdzam wolne miejsce na dysku docelowym. :RE

Polecenie było po prostu mv source-dir destination-dir, gdzie oba katalogi znajdują się na różnych dyskach. Używam mv (GNU coreutils) 7.4. Nigdzie na stronie podręcznika nie znalazłem odpowiedzi na następujące pytania:

  • czy mogą zostać utworzone obcięte pliki?
  • czy w przypadku błędów coś w drzewie źródłowym zostanie usunięte?
  • jak odzyskać (w łatwy i szybki sposób)?
maaartinus
źródło

Odpowiedzi:

8

Myślę, że wprowadzenie do infostrony odpowiada na wszystkie pytania:

Najpierw używa tego samego kodu, którego używa `cp -a ', aby skopiować żądane katalogi i pliki, a następnie (zakładając, że kopiowanie się powiodło) usuwa oryginały. Jeśli kopiowanie nie powiedzie się, część skopiowana na partycję docelową zostanie usunięta. Jeśli skopiujesz trzy katalogi z jednej partycji do drugiej, a kopiowanie pierwszego katalogu się powiedzie, ale drugi nie, pierwszy pozostanie na partycji docelowej, a drugi i trzeci pozostaną na oryginalnej partycji.

Odzyskiwanie nie powinno stanowić problemu, ponieważ dane są zachowywane. Nie wiem, jak bardzo próbuje być atomowy ( mkdirna przykład; konieczna jest kontrola źródła) lub czy w ogóle jest w jego domenie (w porównaniu z jądrem), ale może wystąpić uszkodzenie, jeśli przerwa nastąpi, gdy już usuwa źródło. W tym momencie miałbyś już dobrą kopię w katalogu docelowym, więc wystarczy proste sprawdzenie rozmiaru bajtów.

EDYCJA: Przeprowadziłem testy z dużymi plikami (kilka G) utworzonymi przy użyciu dd, ale bez rozstrzygających wyników. Nigdy nie udało mi się skopiować tylko kilku źródeł - albo anulowałem całą operację (zbyt szybko), albo później nie otrzymałem żadnej szansy z powodu buforowania dysku i być może dobrego projektu systemu plików (moje ^ C zawsze lądowało po udanym przeniesieniu ).

lynxlynxlynx
źródło
1
Jeśli chodzi o stronę informacyjną, czy dobrze rozumiem, że dla każdego katalogu źródłowego wiersza poleceń jest on usuwany, jeśli odpowiednia kopia się powiodła? Mam na myśli, że mv src1 src2 dstpod tym względem działa podobnie mv src1 dst; mv src2 dsti każdy z nich mv src dstjest podobny cp -a src dst && rm -rf src?
maaartinus
1
Tak też to rozumiem (tylko twoi mvs to mv && mv). Ponieważ cp -ajest już rekurencyjny, wątpię, czy dotyczy on pojedynczych plików i katalogów znalezionych podczas przeszukiwania drzewa. Zrobię kilka testów później.
lynxlynxlynx
12

Kiedy mv przenosi się do innego systemu plików, najpierw kopiuje wszystkie dane do nowego systemu plików. Po skopiowaniu nowych danych usuwa stare dane. Oznacza to, że jeśli przeniesienie zostanie przerwane z powodu niepowodzenia, lokalizacja źródłowa powinna nadal zawierać wszystkie dane.

Jeśli chodzi o odzyskiwanie, tylko dane docelowe powinny być uszkodzone. Zamiast ponownie użyć mv, po prostu użyj rsync, a następnie rm ręcznie

rsync -av source-dir/ dest-dir/
rm -rf source-dir
Jordan
źródło