Odpowiedzi:
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.
strace mv /fs1/dir /fs2/
- ostatnią rzeczą, którą robi mv, jest wywoływanie unlinkat
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
mv a b 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
mv
, więc nie jest to tylko GNU.
Przenosisz jeden katalog, przerywasz przenoszenie, a oryginalny katalog pozostanie nienaruszony:
$ mv a b/
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ś:
$ mv a b c/
Jak otrzymałem odpowiedź:
$ mv --version
mv (GNU coreutils) 8.21
$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals. If the copy fails, then the part
that was copied to the destination partition is removed. If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.
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.
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.
Nie. Mv obsługuje obiekt po obiekcie, więc obiekty, które zostały już przetworzone, zostaną usunięte ze źródła.
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.
Jeśli chcesz przerwać mv, ponieważ chcesz rozłączyć się z terminalem, możesz po prostu wysłać go do tła:
* press Ctrl+Z
# bg
# disown
fsck
(który najprawdopodobniej uruchomi się automatycznie przy ponownym uruchomieniu, ponieważ dysk nie został odmontowany w sposób czysty).