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... DIRECTORYArgumenty:
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 prostychWarunkowe 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 -deletersync 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 nginxKopia 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.crtW 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
| Scenariusz | Najlepsze narzędzie | Powód |
|---|---|---|
| Zmiana nazwy lub przeniesienie w obrębie tego samego systemu plików | mv | Atomowe wywołanie systemowe rename(2); zerowe I/O |
| Przeniesienie między systemami plików, małe pliki | mv | Akceptowalne; kopiowanie-a-następnie-usuwanie jest automatyczne |
| Przeniesienie między systemami plików, duże lub krytyczne dane | rsync --remove-source-files | Weryfikacja sumy kontrolnej; możliwość wznowienia |
| Przeniesienie z deduplikacją lub kontrolą przepustowości | rsync | Obsługuje --bwlimit, --checksum, transfer delta |
| Przeniesienie z zachowaniem źródła | cp a następnie weryfikacja | Jawna kontrola nad obiema kopiami |
| Przeniesienie z transformacją (kompresja itp.) | Własny skrypt | mv nie transformuje danych |
| Masowe przeniesienie z filtrowaniem | find + mv -t | Precyzyjna kontrola nad kryteriami wyboru |
Typowe pułapki i jak ich unikać
Niejednoznaczność końcowego ukośnika w katalogach:
mv directory_a/ directory_bJeś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.workPonieważ 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/fileNiezawodne 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 pipefailzapewnia 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
| Sytuacja | Zalecane 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
mvna tym samym systemie plików jest atomowe i nie generuje żadnego I/O dysku — jest to operacja wyłącznie na metadanych przezrename(2).mvmiędzy systemami plików to sekwencyjne kopiowanie-a-następnie-usuwanie; traktuj je jakcpprzy planowaniu niezawodności.- W GNU
mvnie ma flagi-r— katalogi są przenoszone rekurencyjnie domyślnie. --backup=numberedjest najbardziej niedocenianą funkcją bezpieczeństwa produkcyjnego wmv.--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-fileszapewnia weryfikację sumy kontrolnej, którejmvnie 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.
