Co się stanie, jeśli mv
polecenie Linuksa zostanie przerwane? Powiedzmy, że przenoszę cały katalog w inne miejsce i przerywam go podczas przenoszenia. Czy katalog źródłowy nadal pozostanie nietknięty?
72
Jeśli przenosisz katalog w tym samym systemie plików, możesz przenieść pozycję katalogu tylko z jednej lokalizacji w systemie plików do innej. Np. mv /source/dir /target/dir
Usunie pozycję katalogu dir
z /source
i utworzy nową w /target
. Odbywa się to za pomocą jednego wywołania systemu atomowego (tj. Nieprzerwanego). Nie dir
ma to wpływu na i- węzeł zawierający wpisy katalogu, a także faktyczną zawartość samego katalogu.
Jeśli katalog zostanie przeniesiony z jednego systemu plików do innego, wszystkie pliki zostaną najpierw skopiowane do nowego systemu plików, a następnie odłączone od oryginalnego. Jeśli więc przerwiesz mv
podczas kopiowania, możesz skończyć z dwiema kopiami niektórych plików - w starej lokalizacji i w nowej.
fsck
(który najprawdopodobniej uruchomi się automatycznie przy ponownym uruchomieniu, ponieważ dysk nie został odmontowany w sposób czysty).strace mv /fs1/dir /fs2/
- ostatnią rzeczą, którą robi mv, jest wywoływanieunlinkat
wszystkich plików źródłowych jednocześnie (nie jeden po drugim, gdy są kopiowane).Implementacja GNU iteruje argumenty w wierszu poleceń, najpierw próbuje zmienić nazwę, a jeśli to się nie powiedzie, rekurencyjnie kopiuje, a następnie rekurencyjnie usuwa źródło. Więc
usunie przed skopiowaniem b , i nie rozpocznie usuwania czegokolwiek w przed kopiowaniem docelowy jest kompletna.
Zauważ, że dotyczy to tylko implementacji GNU.
Aby wyjaśnić: jeśli jest katalogiem zawierającym d i e , i b jest plikiem, kolejność będzie
źródło
mv
, więc nie jest to tylko GNU.Przenosisz jeden katalog, przerywasz przenoszenie, a oryginalny katalog pozostanie nienaruszony:
Jeśli przeniesiesz wiele katalogów, każdy z nich pozostanie nienaruszony na źródle lub miejscu docelowym, w zależności od tego, kiedy przerwałeś:
Jak otrzymałem odpowiedź:
W ramach testu skopiowałem duży folder do katalogu NFS, przerwałem, a liczba plików w dużym źródłowym folderze pozostała taka sama, a częściowa zawartość pozostała w katalogu NFS. Użyłem „find. -Type f | wc -l” do weryfikacji.
Wygląda na to, że odpowiedź Simona jest poprawna.
źródło
Przyjęta odpowiedź jest zdecydowanie błędna w kwestii przechodzenia między systemami plików - fakt, który już kilka razy zaoszczędził mi wielu kłopotów. Podczas przenoszenia katalogu zawierającego podkatalogi żaden plik w podkatalogu nie zostanie usunięty przed skopiowaniem całego podkatalogu. To znaczy, btw. Rzeczywiste znaczenie „obiekt po obiekcie” - podkatalog JEST obiektem (plikiem), a zatem jego integralność musi zostać zachowana przez pełną kopię w miejscu docelowym, zanim cokolwiek zostanie usunięte. Tak więc odpowiedź Simona wydaje mi się poprawna.
źródło
Nie. Mv obsługuje obiekt po obiekcie, więc obiekty, które zostały już przetworzone, zostaną usunięte ze źródła.
źródło
Zdecydowanie nie. Ruch jest wykonywany obiekt po obiekcie. Dlatego obiekt przeniesiony do miejsca docelowego do momentu przerwania nie będzie już istniał w źródle.
Jeśli mv zostało wydane dla dużego pliku (między różnymi) i zostało przerwane, źródło pozostanie nienaruszone. Na celu zobaczysz niekompletny plik do momentu przerwania.
Możesz jednak przywrócić mv za pomocą tego samego polecenia, a proces będzie kontynuowany.
źródło
Jeśli chcesz przerwać mv, ponieważ chcesz rozłączyć się z terminalem, możesz po prostu wysłać go do tła:
źródło