Czy jest jakaś różnica między mv a {cp + rm starym plikiem} w Uniksie?

14
  • mv a b

  • cp a b;rm a

Są to dwa zestawy instrukcji. Czy jest jakaś różnica między tym, co robią?

Lazer
źródło
1
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.


źródło
1
ale robią dokładnie to samo, prawda?
Lazer
8
Nie, nie robią tego.
3
@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.

rozwijać
źródło
8

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:

  • jest operacją atomową (nie może zostać przerwana przez inną operację pliku procesowego)
  • zajmuje tylko trywialną ilość dodatkowego miejsca na dysku (dodatkowa nazwa w katalogu)
  • zachowuje uprawnienia do plików i prawa własności
  • może być znacznie szybszy, w zależności od ilości danych

Skopiuj i usuń

  • nie jest atomowy (inny proces może zakłócać komendy cp i rm)
  • wymaga dwukrotnego przechowywania danych pliku na dysku (między poleceniami cp i rm)
  • zmienia uprawnienia do plików i prawa własności do wartości domyślnych
  • może być znacznie wolniejszy lub nawet zawieść, w zależności od ilości danych
mpez0
źródło
4

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.

Joachim Sauer
źródło
3

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.

Philippe Leybaert
źródło
3

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

harrymc
źródło
2

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

anonimowy tchórz
źródło
2

cp i rm znacznie obciążają dysk i mogą zawieść z powodu miejsca na dysku.

Ofir
źródło