atomowość? Ale tak naprawdę nie wiem, czy polecenie mv jest atomowe.
Adriano Varoli Piazza
Tak. Dlaczego pytasz?
1
Teraz mvjest podobny do ln+ rm, jednak ten pierwszy będzie działał dla ruchów między systemami plików (który następnie staje się cp+ rm), podczas gdy ten drugi zawiedzie ln(który nie obsługuje twardych łączy między systemami plików).
Chris Jester-Young
Każdy dzień jest dniem szkolnym - dla każdego, kto zastanawia się, jak zastąpić to domyślne zachowanie, potrzebujesz --remove-destinationprzełącznika - stackoverflow.com/a/9371263/409638
robert
Odpowiedzi:
20
Zakładając, że zaangażowane pliki znajdują się w tym samym systemie plików, wtedy mv po prostu zmienia wskaźniki w systemie plików, podczas gdy cp kopiuje całą zawartość pliku, a rm ponownie zmienia wskaźniki. Tak więc mv jest znacznie bardziej wydajny.
@eSKay: Nie. Dwa scenariusze: 1. Cel nie istnieje. mvpo prostu zmienia nazwę pliku (taki sam i-węzeł jak oryginalny plik). cptworzy nowy i-węzeł dla nowego pliku. 2. Cel istnieje. mvrozłącza (usuwa) plik docelowy i zmienia nazwę w jednym kroku. cpnadpisuje i-węzeł pliku docelowego.
Chris Jester-Young
7
mvNigdy też nie zmienia uprawnień ani własności. Wyobraź sobie, że chcesz przenieść plik z homediru swojego kumpla do własnego homediru. Jeśli mvto zrobisz, skończysz z plikiem w swoim homedir, który należy do twojego kumpla. Nie możesz chownlub, w chmodzależności od uprawnień, nawet go nie modyfikować ani nie czytać. Jeśli nie cpnastępuje rmpliku będzie należeć do ciebie i wszystko jest w porządku.
Ludwig Weinzierl
9
Tak, mv ma szansę być atomowy na tym samym dysku, podczas gdy kombinacja cp i rm nigdy nie miała.
Zakłada się, że mv jest implementowany przy użyciu rename(), który jest połączeniem, które ma gwarancję. Zobacz na przykład ten post grupy dyskusyjnej , który cytuje POSIX:
Ta funkcja zmiany nazwy () jest równoważna w przypadku zwykłych plików z tą zdefiniowaną w standardzie ISO C. Jego włączenie tutaj rozszerza tę definicję o działania na katalogach i określa zachowanie, gdy nowy parametr nazywa plik, który już istnieje. Ta specyfikacja wymaga, aby działanie funkcji było atomowe.
Gdy źródło i miejsce docelowe znajdują się na tym samym woluminie fizycznym, wówczas pierwsze podejście jest po prostu zmianą nazwy i jest bardzo szybkie (nawet jeśli pliki są bardzo duże).
cpi rmzawsze będzie musiał załadować / przechowywać wszystkie dane, nawet jeśli nie byłyby konieczne.
mv jest w istocie operacją „zmiany nazwy”. Oznacza to, że sam plik pozostawia się w tym samym miejscu na dysku. Nie jest wykonywana żadna operacja na pliku.
Różnica polega na tym, że mv zachowuje atrybuty pliku, podczas gdy domyślnie cp tego nie robi, na przykład ustawia datę utworzenia na bieżącą datę.
Aby zastąpić to ustawienie domyślne, użyj „cp -p”, aby zachować ostatnią modyfikację danych, czas ostatniego dostępu, identyfikator użytkownika i identyfikator grupy (tylko jeśli ma do tego uprawnienia), bity uprawnień do plików oraz SUID i SGID bitów
mv po prostu zmienia metadane systemu plików w pliku związane z jego nazwą i lokalizacją, podczas gdy cp tworzy osobną kopię pliku, co trwa znacznie dłużej, ponieważ musi w pełni odczytać pierwszy plik, a następnie zapisać jego zawartość do innego pliku
mv
jest podobny doln
+rm
, jednak ten pierwszy będzie działał dla ruchów między systemami plików (który następnie staje sięcp
+rm
), podczas gdy ten drugi zawiedzieln
(który nie obsługuje twardych łączy między systemami plików).--remove-destination
przełącznika - stackoverflow.com/a/9371263/409638Odpowiedzi:
Zakładając, że zaangażowane pliki znajdują się w tym samym systemie plików, wtedy mv po prostu zmienia wskaźniki w systemie plików, podczas gdy cp kopiuje całą zawartość pliku, a rm ponownie zmienia wskaźniki. Tak więc mv jest znacznie bardziej wydajny.
źródło
mv
po prostu zmienia nazwę pliku (taki sam i-węzeł jak oryginalny plik).cp
tworzy nowy i-węzeł dla nowego pliku. 2. Cel istnieje.mv
rozłącza (usuwa) plik docelowy i zmienia nazwę w jednym kroku.cp
nadpisuje i-węzeł pliku docelowego.mv
Nigdy też nie zmienia uprawnień ani własności. Wyobraź sobie, że chcesz przenieść plik z homediru swojego kumpla do własnego homediru. Jeślimv
to zrobisz, skończysz z plikiem w swoim homedir, który należy do twojego kumpla. Nie możeszchown
lub, wchmod
zależności od uprawnień, nawet go nie modyfikować ani nie czytać. Jeśli niecp
następujerm
pliku będzie należeć do ciebie i wszystko jest w porządku.Tak, mv ma szansę być atomowy na tym samym dysku, podczas gdy kombinacja cp i rm nigdy nie miała.
Zakłada się, że mv jest implementowany przy użyciu
rename()
, który jest połączeniem, które ma gwarancję. Zobacz na przykład ten post grupy dyskusyjnej , który cytuje POSIX:źródło
W tym samym systemie plików mv zmienia odwołanie do katalogu, wskazując na ten sam i-węzeł (dane pliku i metadane) w ten sposób:
Skopiuj i usuń
źródło
Gdy źródło i miejsce docelowe znajdują się na tym samym woluminie fizycznym, wówczas pierwsze podejście jest po prostu zmianą nazwy i jest bardzo szybkie (nawet jeśli pliki są bardzo duże).
cp
irm
zawsze będzie musiał załadować / przechowywać wszystkie dane, nawet jeśli nie byłyby konieczne.źródło
mv jest w istocie operacją „zmiany nazwy”. Oznacza to, że sam plik pozostawia się w tym samym miejscu na dysku. Nie jest wykonywana żadna operacja na pliku.
źródło
Różnica polega na tym, że mv zachowuje atrybuty pliku, podczas gdy domyślnie cp tego nie robi, na przykład ustawia datę utworzenia na bieżącą datę.
Aby zastąpić to ustawienie domyślne, użyj „cp -p”, aby zachować ostatnią modyfikację danych, czas ostatniego dostępu, identyfikator użytkownika i identyfikator grupy (tylko jeśli ma do tego uprawnienia), bity uprawnień do plików oraz SUID i SGID bitów
źródło
Tak.
mv po prostu zmienia metadane systemu plików w pliku związane z jego nazwą i lokalizacją, podczas gdy cp tworzy osobną kopię pliku, co trwa znacznie dłużej, ponieważ musi w pełni odczytać pierwszy plik, a następnie zapisać jego zawartość do innego pliku
źródło
cp i rm znacznie obciążają dysk i mogą zawieść z powodu miejsca na dysku.
źródło