15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
02.01.2024

Polecenie `mv` w Linux: Kompletny przewodnik techniczny i zaawansowany poradnik użytkowania

Polecenie mv w Linux przenosi lub zmienia nazwy plików i katalogów poprzez aktualizację metadanych systemu plików — konkretnie wpisu katalogu — bez kopiowania danych podczas operacji w obrębie tego samego systemu plików. Sprawia to, że jest to atomowa, niemal natychmiastowa operacja dla przeniesień w obrębie tej samej partycji, niezależnie od rozmiaru pliku.

Zrozumienie tej różnicy oddziela zwykłych użytkowników od administratorów, którzy potrafią zdiagnozować, dlaczego przeniesienie między dwoma punktami montowania zachowuje się inaczej niż przeniesienie w obrębie jednej partycji, dlaczego niektóre operacje mv wyzwalają operacje I/O dysku, a inne nie, oraz jak bezpiecznie używać polecenia w środowiskach produkcyjnych, gdzie integralność danych jest niepodważalna.

Co polecenie mv faktycznie robi pod maską

Gdy wykonujesz mv source destination na tym samym systemie plików, jądro wywołuje rename(2) — pojedyncze wywołanie systemowe, które atomowo przypisuje wpis katalogu. Żadne dane nie są odczytywane ani zapisywane na dysk. Numer inode pozostaje identyczny; zmienia się tylko ścieżka.

Gdy źródło i cel znajdują się na różnych systemach plików (różnych partycjach, montowaniach NFS lub montowaniach bind), mv przechodzi do sekwencji kopiuj-a-następnie-usuń: odczytuje dane źródłowe, zapisuje je do miejsca docelowego i usuwa źródło dopiero po pomyślnym zapisie. Ma to krytyczne implikacje:

  • Przerwane przeniesienia między systemami plików mogą pozostawić częściową kopię w miejscu docelowym i nienaruszony oryginał w źródle, lub — w najgorszym przypadku — usunąć źródło przed zakończeniem zapisu.
  • Przeniesienia dużych plików między systemami plików zużywają przepustowość I/O i czas proporcjonalnie do rozmiaru pliku.
  • Uprawnienia i własność mogą nie zostać poprawnie przeniesione, jeśli docelowy system plików nie obsługuje tego samego modelu uprawnień (np. FAT32, niektóre udziały sieciowe).

Ta różnica w zachowaniu jest niewidoczna w składni polecenia, ale ma fundamentalne znaczenie dla decyzji administracyjnych na serwerach działających z Hostingiem VPS lub Serwerami Dedykowanymi z wieloma punktami montowania.

Składnia i podstawowe opcje

mv [OPTIONS] SOURCE DESTINATION
mv [OPTIONS] SOURCE... DIRECTORY

Argumenty:

    SOURCE — Jeden lub więcej plików lub katalogów do przeniesienia lub zmiany nazwy.
    DESTINATION — Ścieżka docelowa. Jeśli jest to istniejący katalog, źródło zostaje umieszczone wewnątrz niego. Jeśli jest to nieistniejąca ścieżka, źródło zostaje przemianowane na tę ścieżkę.
    
    Pełna dokumentacja opcji
    
    Opcja
    Forma długa
    Zachowanie
    
    
    -i
    --interactive
    Pyta przed nadpisaniem istniejącego pliku
    
    
    -f
    --force
    Pomija wszystkie monity; nadpisuje bez potwierdzenia
    
    
    -n
    --no-clobber
    Nigdy nie nadpisuje istniejącego pliku; pomija bez komunikatu
    
    
    -u
    --update
    Przenosi tylko gdy źródło jest nowsze niż cel lub cel nie istnieje
    
    
    -v
    --verbose
    Wyświetla nazwę każdego pliku podczas przetwarzania
    
    
    -b
    --backup
    Tworzy kopię zapasową każdego pliku, który zostałby nadpisany
    
    
    --suffix=SUFFIX
    --suffix
    Definiuje sufiks kopii zapasowej (domyślnie ~)
    
    
    --strip-trailing-slashes
    —
    Usuwa końcowe ukośniki z argumentów źródłowych
    
    
    -t DIR
    --target-directory
    Przenosi wszystkie źródła do wskazanego katalogu
    
    
    -T
    --no-target-directory
    Traktuje cel jako zwykły plik, a nie katalog
    
    
    Uwaga: Flaga -r / -R wymieniana w wielu poradnikach nie istnieje w GNU mv. W przeciwieństwie do cp, polecenie mv domyślnie przenosi katalogi rekurencyjnie, ponieważ operuje na wpisach katalogów, a nie na zawartości plików. Przekazanie -r do mv na większości dystrybucji Linux spowoduje błąd lub zostanie po cichu zignorowane w zależności od implementacji.
    Podstawowe operacje z precyzyjnymi przykładami
    Przenoszenie pliku do innego katalogu
    mv /home/user/report.txt /var/backups/
    Plik report.txt zostaje przeniesiony do /var/backups/. Jeśli /var/backups/ znajduje się na tym samym systemie plików co /home/user/, operacja jest natychmiastowa. Jeśli nie, dane są fizycznie kopiowane.
    Zmiana nazwy pliku w miejscu
    mv old_config.conf new_config.conf
    Obie ścieżki mają ten sam katalog nadrzędny, więc jest to czyste wywołanie rename(2) — bez przemieszczania danych, bez I/O.
    Przenoszenie wielu plików do katalogu
    mv file1.txt file2.txt file3.txt /var/www/html/assets/
    Gdy podano wiele źródeł, cel musi być istniejącym katalogiem. Jeśli nie istnieje, mv zwróci błąd.
    Przenoszenie katalogu
    mv /home/user/project /opt/projects/
    Całe drzewo katalogów — wraz ze wszystkimi zagnieżdżonymi plikami i podkatalogami — jest przenoszone jako pojedyncza operacja atomowa na tym samym systemie plików. Flaga -r nie jest wymagana ani akceptowana.
    Zaawansowane wzorce użycia
    Używanie --backup w celu zapobiegania przypadkowej utracie danych
    Opcja --backup jest jednym z najbardziej niedocenianych mechanizmów bezpieczeństwa w mv. Tworzy wersjonowaną kopię zapasową każdego pliku, który zostałby nadpisany:
    mv --backup=numbered config.yml /etc/app/config.yml
    Powoduje to powstanie /etc/app/config.yml.~1~, .~2~ i tak dalej dla kolejnych nadpisań. W zautomatyzowanych skryptach wdrożeniowych ten wzorzec zapewnia lekki mechanizm wycofywania zmian bez dedykowanego narzędzia do tworzenia kopii zapasowych.
    Tryby kontroli kopii zapasowych:
    
    none / off — Brak kopii zapasowej (domyślne zachowanie bez --backup)
    simple / never — Zawsze tworzy prostą kopię zapasową z sufiksem ~
  • numbered / t — Tworzy numerowane kopie zapasowe (.~1~, .~2~, …)
  • existing / nil — Używa numerowanych kopii zapasowych, jeśli już istnieją; w przeciwnym razie prostych
  • Warunkowe przenoszenie z --update

    mv --update /tmp/processed/*.csv /data/archive/

    Przenoszone będą tylko pliki z /tmp/processed/, które są nowsze niż ich odpowiedniki w /data/archive/. Pliki z identycznymi lub starszymi znacznikami czasu pozostają niezmienione. Jest to szczególnie przydatne w potokach ETL i skryptach rotacji logów, gdzie idempotentność ma znaczenie.

    Używanie -t dla składni przyjaznej skryptom

    Opcja --target-directory odwraca kolejność argumentów, czyniąc ją kompatybilną z potokami xargs i find:

    find /var/log -name "*.log.gz" -mtime +30 | xargs mv -t /mnt/cold-storage/logs/

    Bez -t, xargs musiałby konstruować listę argumentów inaczej. Ten wzorzec jest znacznie bardziej niezawodny w automatyzacji produkcyjnej.

    Łączenie --no-clobber z wyjściem szczegółowym

    mv -nv *.conf /etc/app/conf.d/

    Przenosi wszystkie pliki .conf bez nadpisywania żadnych istniejących i wyświetla każde pomyślne przeniesienie na stdout. Kombinacja ta jest idealna do bezpiecznych, audytowalnych operacji masowych.

    Bezpieczne przenoszenie plików między systemami plików

    Przy przenoszeniu dużych plików lub katalogów między punktami montowania, rozważ ten wzorzec w celu zapewnienia integralności:

    rsync -a --remove-source-files /source/path/ /destination/path/ && 
    find /source/path -type d -empty -delete

    rsync z --remove-source-files wykonuje zweryfikowane kopiowanie-a-następnie-usuwanie z walidacją sumy kontrolnej, której mv nie zapewnia dla operacji między systemami plików. Używaj tego podejścia do krytycznych migracji danych na serwerach produkcyjnych.

    Praktyczne przypadki użycia w administracji systemem

    Rotacja logów aplikacji

    mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%Y%m%d)
    kill -USR1 $(cat /var/run/nginx.pid)

    Zmienia nazwę aktywnego pliku logu i sygnalizuje Nginx, aby ponownie otworzył deskryptor pliku logu. Kombinacja ta stanowi podstawę ręcznej rotacji logów, zanim logrotate obsłuży ją automatycznie.

    Atomowe wdrażanie plików konfiguracyjnych

    mv --backup=numbered /tmp/nginx.conf /etc/nginx/nginx.conf
    nginx -t && systemctl reload nginx

    Kopia zapasowa zapewnia zachowanie poprzedniej konfiguracji, jeśli nowa nie przejdzie walidacji.

    Organizowanie zasobów serwera WWW

    Na serwerze z aplikacją webową, masowe porządkowanie przesłanych plików według typu:

    mv /var/www/uploads/*.jpg /var/www/uploads/images/
    mv /var/www/uploads/*.pdf /var/www/uploads/documents/
    mv /var/www/uploads/*.mp4 /var/www/uploads/video/

    Ten rodzaj ustrukturyzowanego zarządzania zasobami jest powszechny na serwerach hostujących strony przez Współdzielony Hosting WWW lub zarządzane środowiska VPS z cPanel.

    Staging odnowień certyfikatów SSL

    Przy ręcznym zarządzaniu odnawianymi certyfikatami, mv z kopią zapasową jest bezpiecznym wzorcem wdrożeniowym:

    mv --backup=simple /etc/ssl/certs/domain.crt /etc/ssl/certs/domain.crt.bak
    mv /tmp/new_domain.crt /etc/ssl/certs/domain.crt

    W przypadku zautomatyzowanego zarządzania certyfikatami, połączenie tego z odpowiednio skonfigurowaną usługą Certyfikatów SSL całkowicie eliminuje potrzebę ręcznej rotacji.

    Archiwizacja danych e-mail na serwerze pocztowym

    Na serwerze z usługami pocztowymi, przenoszenie przetworzonych skrzynek pocztowych do zimnego magazynu:

    mv --update /var/mail/processed/ /mnt/archive/mail/$(date +%Y-%m)/

    Ma to bezpośrednie zastosowanie w środowiskach korzystających z dedykowanej infrastruktury Hostingu E-mail, gdzie zarządzanie skrzynkami pocztowymi odbywa się na poziomie systemu plików.

    mv vs. cp + rm vs. rsync: Kiedy używać którego

    ScenariuszNajlepsze narzędziePowód
    Zmiana nazwy lub przeniesienie w obrębie tego samego systemu plikówmvAtomowe wywołanie systemowe rename(2); zerowe I/O
    Przeniesienie między systemami plików, małe plikimvAkceptowalne; kopiowanie-a-następnie-usuwanie jest automatyczne
    Przeniesienie między systemami plików, duże lub krytyczne danersync --remove-source-filesWeryfikacja sumy kontrolnej; możliwość wznowienia
    Przeniesienie z deduplikacją lub kontrolą przepustowościrsyncObsługuje --bwlimit, --checksum, transfer delta
    Przeniesienie z zachowaniem źródłacp a następnie weryfikacjaJawna kontrola nad obiema kopiami
    Przeniesienie z transformacją (kompresja itp.)Własny skryptmv nie transformuje danych
    Masowe przeniesienie z filtrowaniemfind + mv -tPrecyzyjna kontrola nad kryteriami wyboru

    Typowe pułapki i jak ich unikać

    Niejednoznaczność końcowego ukośnika w katalogach:

    mv directory_a/ directory_b

    Jeśli directory_b istnieje, directory_a zostaje umieszczony *wewnątrz* directory_b, co skutkuje directory_b/directory_a/. Jeśli directory_b nie istnieje, directory_a zostaje przemianowany na directory_b. To zachowanie zaskakuje wielu administratorów. Użyj mv -T, aby wymusić traktowanie celu jako ścieżki do pliku, a nie katalogu-kontenera.

    Rozwijanie wieloznaczników bez dopasowań:

    mv *.log /archive/

    Jeśli nie istnieją żadne pliki .log, powłoka rozwija *.log do literalnego ciągu *.log, a mv próbuje przenieść plik dosłownie nazwany *.log, co kończy się mylącym błędem. Użyj nullglob w skryptach bash:

    shopt -s nullglob
    files=(*.log)
    [[ ${#files[@]} -gt 0 ]] && mv "${files[@]}" /archive/

    Wyścigi w środowiskach współbieżnych:

    Wiele procesów przenoszących pliki ze współdzielonego katalogu buforowego może powodować konflikty. Użyj mv z unikalną tymczasową nazwą, a następnie atomowo zmień nazwę:

    mv /spool/job_123.tmp /spool/processing/job_123.work

    Ponieważ rename(2) jest atomowe, ten wzorzec jest bezpieczny dla kolejek zadań na jednym systemie plików.

    Przenoszenie plików o nazwach zaczynających się od myślnika:

    mv -- -oddfile.txt /destination/

    -- sygnalizuje koniec opcji, zapobiegając interpretowaniu -oddfile.txt jako flagi.

    Uprawnienia po przeniesieniu między systemami plików:

    mv nie zachowuje rozszerzonych atrybutów (xattrs), ACL ani kontekstów SELinux we wszystkich typach systemów plików. Po przeniesieniu między systemami plików zweryfikuj za pomocą:

    ls -lZ /destination/file
    getfattr -d /destination/file

    Niezawodne skryptowanie mv w środowisku produkcyjnym

    W każdym skrypcie używającym mv w kontekście produkcyjnym, bezwarunkowo stosuj te praktyki:

    #!/usr/bin/env bash
    set -euo pipefail
    
    SOURCE="/var/data/export"
    DEST="/mnt/nas/backup/$(date +%Y%m%d)"
    
    # Verify source exists
    [[ -e "$SOURCE" ]] || { echo "Source not found: $SOURCE" >&2; exit 1; }
    
    # Verify destination is writable
    mkdir -p "$DEST"
    [[ -w "$DEST" ]] || { echo "Destination not writable: $DEST" >&2; exit 1; }
    
    # Perform move with verbose output for logging
    mv -v "$SOURCE" "$DEST/"
    • set -euo pipefail zapewnia wyjście ze skryptu przy każdym błędzie, niezdefiniowanej zmiennej lub nieudanym potoku.
    • Jawne sprawdzanie istnienia i możliwości zapisu zapobiega cichym awariom.
    • Szczegółowe wyjście tworzy ścieżkę audytu w logach systemowych.

    Macierz decyzyjna: Wybór właściwych opcji mv

    SytuacjaZalecane flagi
    Interaktywnie, pojedynczy plik, nieznany stan celu-i -v
    Zautomatyzowany skrypt, cel nie może być nadpisany-n
    Zautomatyzowany skrypt, zawsze nadpisuj-f
    Wdrożenie z możliwością wycofania--backup=numbered
    Przeniesienie w stylu synchronizacji, tylko nowsze pliki-u
    Masowe przeniesienie przez find lub xargs-t /destination/
    Debugowanie skryptu-v
    Pliki o specjalnych nazwach (myślniki, spacje)-- przed źródłem

    Kluczowe wnioski techniczne

    • mv na tym samym systemie plików jest atomowe i nie generuje żadnego I/O dysku — jest to operacja wyłącznie na metadanych przez rename(2).
    • mv między systemami plików to sekwencyjne kopiowanie-a-następnie-usuwanie; traktuj je jak cp przy planowaniu niezawodności.
    • W GNU mv nie ma flagi -r — katalogi są przenoszone rekurencyjnie domyślnie.
    • --backup=numbered jest najbardziej niedocenianą funkcją bezpieczeństwa produkcyjnego w mv.
    • --no-clobber (-n) i --force (-f) wzajemnie się wykluczają; wygrywa ostatnio podana opcja.
    • W przypadku krytycznych migracji danych między systemami plików, rsync --remove-source-files zapewnia weryfikację sumy kontrolnej, której mv nie może dostarczyć.
    • Zawsze cytuj zmienne w skryptach i używaj -- do obsługi nazw plików ze znakami specjalnymi.
    • Weryfikuj konteksty SELinux i ACL po każdym przeniesieniu między systemami plików w środowiskach z wzmocnionym zabezpieczeniem.

    Często zadawane pytania

    Czy mv działa inaczej na SSD w porównaniu z HDD?

    W przypadku przeniesień w obrębie tego samego systemu plików — nie. Operacja jest aktualizacją metadanych niezależnie od sprzętu pamięci masowej. W przypadku przeniesień między systemami plików, SSD skracają czas fazy kopiowania, ale logiczne zachowanie i ryzyka są identyczne.

    Dlaczego mv czasami trwa długo nawet dla małego pliku?

    Jeśli źródło i cel znajdują się na różnych systemach plików — w tym montowaniach NFS, tmpfs lub oddzielnych partycjach — mv wykonuje pełną kopię. Nawet mały plik przenoszony przez wolne montowanie sieciowe będzie wolny. Sprawdź za pomocą df -h source destination, czy współdzielą system plików.

    Czy mv może być używane do przenoszenia plików między kontenerami Docker lub woluminami?

    Nie bezpośrednio. Woluminy Docker to oddzielne przestrzenie nazw systemu plików. mv w obrębie jednego woluminu działa normalnie, ale przenoszenie danych między woluminami wymaga operacji w stylu cp, zazwyczaj przez docker cp lub współdzielone montowanie bind.

    Co się dzieje, gdy mv zostaje przerwane w trakcie operacji przeniesienia między systemami plików?

    Plik źródłowy pozostaje nienaruszony do momentu zakończenia kopiowania i pomyślnego usunięcia. Jeśli proces zostanie zabity po skopiowaniu, ale przed usunięciem, istnieją obie kopie. Jeśli zostanie zabity podczas kopiowania, częściowy plik docelowy pozostaje, a źródło jest niezmienione. Zawsze weryfikuj obie ścieżki po przerwaniu przeniesienia między systemami plików mv.

    Czy mv jest bezpieczne do użycia w zadaniach cron bez flag interaktywnych?

    Tak, pod warunkiem że jawnie używasz -f lub -n w celu wyciszenia wszelkich monitów (które spowodowałyby zawieszenie zadania cron), weryfikujesz ścieżki przed wykonaniem i przekierowujesz zarówno stdout, jak i stderr do pliku logu w celu audytowalności.

    15%

    Zaoszczędź 15% na wszystkich usługach hostingowych

    Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

    Użyj kodu:

    Skills
    Rozpocznij