Útmutatók

Honnan jön a FileMv neve? A Unix mv parancs története és kapcsolói

Két betű, ötvenöt év: a FileMv neve a Unix mv parancsból jön. Megmutatjuk, honnan ered az mv, miért olyan gyors, és mire valók a kapcsolói, a -i-től a --backupig.

FileMv csapatFrissítve:11 perc olvasás

Honnan jön a FileMv neve? A Unix mv parancs története és kapcsolói

A FileMv neve két részből áll: a file magától értetődik, a Mv viszont egy több mint ötvenéves Unix-parancsra utal. Az mv (a move, „áthelyez” rövidítése) az a parancs, amellyel Linuxon, macOS-en és minden Unix-szerű rendszeren fájlokat helyezünk át vagy nevezünk át. Egy dolgot csinál, azt jól, és nem kérdez feleslegesen. Ezt szerettük volna mi is egy ingyenes fájlküldő esetében: egy fájl kerüljön el A pontból B pontba, szertartás nélkül. Ebben a cikkben elmeséljük, honnan jön az mv, mi történik a háttérben, amikor kiadod, és példákkal végigmegyünk a legfontosabb kapcsolóin.

Egy parancs, amely ötvenöt éve ugyanazt csinálja

Az mv egyidős a Unixszal. Már a Bell Labs-ben Ken Thompson és Dennis Ritchie által írt rendszer első kézikönyvében szerepel, amely 1971 novemberében jelent meg. Ugyanitt található a cp (másolás), az rm (törlés), az ls (listázás) és a cat is; a nevek azóta sem változtak.

Miért ilyen rövidek ezek a nevek? Mert akkoriban a gépeket nem monitoron, hanem Teletype-on, egy elektromechanikus írógép-terminálon keresztül használták. Egy Teletype Model 33 körülbelül tíz karaktert nyomtatott másodpercenként, a billentyűk nehezen jártak, és minden leütés papírra került. Ilyen körülmények között a move helyett mv-t gépelni nem lustaság volt, hanem józan ész. A kétbetűs parancsnevek ebből az időből maradtak ránk, és mire a terminálok felgyorsultak, már annyira beleégtek a felhasználók kezébe, hogy senki nem akarta őket megváltoztatni.

Az mv a Unix-filozófia iskolapéldája is. Doug McIlroy, a Unix-csapat egyik vezetője 1978-ban így foglalta össze az elvet: írj olyan programot, amely egyetlen dolgot csinál, de azt jól. Az mv nem tömörít, nem ellenőriz vírust, nem küld értesítést. Áthelyez. Minden mást más programok végeznek, és ezeket a felhasználó tetszése szerint kombinálhatja.

Ma Linuxon jellemzően a GNU coreutils mv-je fut (szerzői Mike Parker, David MacKenzie és Jim Meyering), macOS-en és a BSD-kben pedig a BSD-ágból származó változat. A kettő alapjaiban ugyanúgy viselkedik, a kapcsolóik egy részében viszont eltérnek; erre alább még visszatérünk.

Mit csinál valójában az mv?

Az mv két dologra való, és a kettő valójában ugyanaz:

mv jelentes.pdf archiv/          # áthelyezés egy másik könyvtárba
mv jelentes.pdf jelentes-v2.pdf  # átnevezés
mv jelentes.pdf archiv/2026.pdf  # áthelyezés és átnevezés egyszerre

Unixon nincs külön „átnevezés” parancs, mert nincs is rá szükség: egy fájl átnevezése és áthelyezése ugyanaz a művelet. Hogy miért, ahhoz egy kicsit be kell néznünk a fájlrendszer motorháztetője alá.

Az inode és a könyvtárbejegyzés

Egy Unix-fájlrendszerben a fájl tartalma és a fájl neve külön helyen él. A fájl adatait és tulajdonságait (méret, jogosultságok, módosítás ideje, hol vannak a blokkok a lemezen) egy inode nevű szerkezet írja le. A fájl neve ehhez képest csak egy bejegyzés egy könyvtárban: egy sor, amely azt mondja, hogy „a jelentes.pdf név a 4 718 233-as inode-ra mutat”.

Ha egy fájlt ugyanazon a fájlrendszeren belül helyezel át, az mv a tartalomhoz hozzá sem nyúl. Csak a könyvtárbejegyzést írja át: kitörli a nevet az egyik könyvtárból, és felveszi a másikba. Ezért van az, hogy egy 50 GB-os videófájlt ugyanazon a lemezen belül egy szempillantás alatt áthelyezhetsz, miközben a másolása perceket venne igénybe.

Az inode számát meg is nézheted, és láthatod, hogy áthelyezés után sem változik:

$ ls -i video.mp4
4718233 video.mp4
$ mv video.mp4 filmek/
$ ls -i filmek/video.mp4
4718233 filmek/video.mp4

A rename() rendszerhívás

A legelső Unixokban az mv ezt két lépésben csinálta: létrehozott egy új nevet ugyanarra az inode-ra (link), majd kitörölte a régit (unlink). Ennek volt egy kellemetlen mellékhatása: ha a két lépés között megszakadt valami, a fájl két néven, vagy rosszabb esetben egyiken sem maradt meg rendesen.

Erre adott választ a rename() rendszerhívás, amely a 4.2BSD-vel jelent meg 1983-ban, és később a POSIX-szabvány része lett. A rename() atomikus: a művelet vagy teljesen megtörténik, vagy egyáltalán nem, köztes állapotot más program nem lát. Ha a célnéven már létezik egy fájl, azt egyetlen lépésben cseréli le, úgyhogy a célnév egyetlen pillanatra sem tűnik el.

Ezt a tulajdonságot rengeteg program használja ki. Egy szövegszerkesztő, egy adatbázis vagy egy telepítő gyakran úgy menti a fájlt, hogy először egy ideiglenes fájlba írja, majd rename()-mel a helyére teszi. Így ha mentés közben elmegy az áram, a régi változat épen marad, és soha nem marad félig megírt fájl a helyén.

És ha két külön lemez között helyezel át?

Az inode-trükk csak egy fájlrendszeren belül működik, mert az inode-szám csak ott értelmezhető. Ha a forrás és a cél két különböző fájlrendszeren van (például a belső lemezen és egy pendrive-on), a rename() hibát ad (EXDEV, „cross-device link”). Ilyenkor az mv csendben átvált egy másik stratégiára: átmásolja a tartalmat, a jogosultságokat és az időbélyegeket, majd törli az eredetit.

Ez lassabb, és már nem atomikus: ha másolás közben megszakad, a cél félkész lehet, a forrás viszont ilyenkor még megvan, mert törölni csak a sikeres másolás után töröl. Érdemes tudni, hogy ugyanaz az mv parancs az egyik esetben egy pillanat, a másikban akár órák.

Az mv legfontosabb kapcsolói

A POSIX-szabvány mindössze két kapcsolót ír elő (-f és -i); a GNU és a BSD változat ennél jóval többet tud. Az alábbiak a GNU coreutils mv-re vonatkoznak, a BSD/macOS-eltéréseket külön jelezzük.

-i: kérdezz, mielőtt felülírsz

Alapból az mv szó nélkül felülírja a célfájlt, ha az már létezik. Ez a parancs leggyakoribb csapdája: egy elgépelt név, és egy régi fájl a semmibe vész. A -i (interactive) kapcsolóval az mv minden felülírás előtt rákérdez:

$ mv -i uj.txt regi.txt
mv: overwrite 'regi.txt'? n

Sokan ezért alias-t állítanak be a .bashrc-ben: alias mv='mv -i'. Ennek csak annyi a hátránya, hogy könnyű megszokni, és egy másik gépen, ahol nincs beállítva, már nem véd.

-f: ne kérdezz semmit

A -f (force) az ellenkezője: soha nem kérdez, akkor sem, ha a célfájl írásvédett, és az mv egyébként rákérdezne. Szkriptekben hasznos, ahol nincs, aki válaszoljon. Ha a -i, -f és -n közül többet is megadsz, az utolsó érvényes: az mv -i -f tehát nem kérdez.

-n: soha ne írj felül

A -n (no-clobber) egyszerűen kihagyja azokat a fájlokat, amelyeknek a célhelyén már van valami, kérdés nélkül. Akkor jó, ha egy nagy adag fájlt helyezel át, és biztos akarsz lenni benne, hogy semmi meglévőt nem írsz felül. A GNU coreutils 9.3-as verziója óta ugyanez --update=none néven is elérhető, és a GNU dokumentáció szkriptekbe inkább ezt ajánlja, mert a -n viselkedése platformonként apróságokban eltér. macOS-en -n-ként működik.

-u: csak ha újabb

A -u (update) csak akkor helyez át egy fájlt, ha a célhelyen még nincs ilyen, vagy ha a forrás újabb, mint a célfájl. Kézi szinkronizálásnál hasznos, amikor két mappa tartalmát fésülöd össze, és nem akarod, hogy egy régebbi változat felülírja a frissebbet.

-v: mondd el, mit csinálsz

A -v (verbose) minden áthelyezett fájlról kiír egy sort. Sok fájlnál és szkriptekben aranyat ér, mert utólag is látszik, mi hová került:

$ mv -v *.jpg fotok/
renamed 'IMG_0001.jpg' -> 'fotok/IMG_0001.jpg'
renamed 'IMG_0002.jpg' -> 'fotok/IMG_0002.jpg'

-b és --backup: mentsd el, amit felülírnál

A -b kapcsolóval az mv felülírás előtt biztonsági másolatot készít a célfájlról, alapból egy ~ végződéssel (regi.txt~). A --backup=numbered számozott mentéseket készít (regi.txt.~1~, regi.txt.~2~), az -S (--suffix) kapcsolóval pedig saját végződést adhatsz meg. Ez a GNU-változat specialitása, macOS-en nincs.

mv --backup=numbered beallitasok.conf /etc/app/beallitasok.conf

-t: a cél előre

Az mv utolsó argumentuma a cél. A -t (target-directory) kapcsolóval a célkönyvtárat előre írhatod, ami akkor jön jól, ha a forrásfájlok listáját egy másik program állítja elő, például a find vagy az xargs:

find . -name '*.log' -mtime +30 -exec mv -t ./regi-naplok/ {} +

Ez a parancs a 30 napnál régebbi naplófájlokat egyetlen lépésben áthelyezi a regi-naplok könyvtárba.

-T: a cél soha ne legyen könyvtár

A -T (no-target-directory) a fordítottja: azt mondja az mv-nek, hogy a célt mindig névként kezelje, soha ne könyvtárként. Enélkül az mv projekt backup két különböző dolgot csinál attól függően, hogy a backup már létezik-e: ha nem, átnevezi a projekt-et backup-ra; ha igen, beleteszi (backup/projekt). Szkriptekben ez a kétértelműség meglepő hibákhoz vezet; a -T megszünteti.

--exchange: két fájl cseréje egy lépésben

Az egyik legújabb kapcsoló: a GNU coreutils 9.5-ös verziója óta az mv --exchange a b megcseréli a két fájlt, atomikusan. Ehhez a Linux renameat2() rendszerhívását használja, ezért csak olyan rendszeren és fájlrendszeren működik, amely ezt támogatja; ha a cél könyvtár, a -T kapcsolóval együtt kell használni. Régen erre három lépés és egy ideiglenes fájlnév kellett.

Gyors összefoglaló

KapcsolóMit csinálmacOS-en is?
-ifelülírás előtt rákérdezigen
-fsoha nem kérdezigen
-nsoha nem ír felüligen
-ucsak ha a forrás újabbnem
-vkiírja, mit helyezett átigen
-b, --backup, -Sbiztonsági mentés felülírás előttnem
-t KÖNYVTÁRcélkönyvtár előrenem
-Ta cél mindig név, nem könyvtárnem
--exchangekét fájl atomikus cseréjenem

Gyakori csapdák és trükkök

Kötőjellel kezdődő fájlnév. Ha egy fájl neve -f.txt, az mv -f.txt uj.txt parancs kapcsolónak hiszi. Megoldás: a -- jelzi, hogy innentől nem jön több kapcsoló (mv -- -f.txt uj.txt), vagy írd elé az aktuális könyvtárat (mv ./-f.txt uj.txt).

Csillag és rejtett fájlok. Az mv * cel/ nem viszi át a ponttal kezdődő, rejtett fájlokat (például .env, .gitignore), mert a shell a *-ot nem bontja ki ezekre. Ez sokszor jó, de ha egy egész mappát költöztetsz, könnyű ott felejteni valamit. Ilyenkor egyszerűbb magát a könyvtárat áthelyezni.

Tömeges átnevezés. Az mv egyszerre csak egy célnevet ismer, mintára nem tud átnevezni (mv *.jpeg *.jpg nem azt csinálja, amit várnál). Erre egy rövid ciklus való:

for f in *.jpeg; do mv -- "$f" "${f%.jpeg}.jpg"; done

Gyors biztonsági mentés. Bash-ben a kapcsos zárójeles kibontással egy fájlt egyetlen rövid paranccsal átnevezhetsz .bak végűre:

mv beallitasok.conf{,.bak}   # = mv beallitasok.conf beallitasok.conf.bak

Nincs visszavonás. Az mv nem tesz semmit a kukába, és nincs „Ctrl+Z”. Amit felülírt, az a fájlrendszer szintjén eltűnt. Fontos fájloknál ezért érdemes a -i, -n vagy --backup valamelyikét használni.

mv és cp: áthelyezés vagy másolás?

A két parancs egymás testvére, de a lényeg más. A cp másolatot készít: utána két független példány létezik, és ha az egyiket módosítod, a másik nem változik. Az mv ugyanazt a fájlt teszi máshová: utána is csak egy példány van, csak más néven vagy más helyen. Ugyanazon a lemezen belül a cp ezért időt és helyet igényel, az mv gyakorlatilag semmit.

file mv: hogyan lett a fájlmozgatásból FileMv

A FileMv neve nem egy márkaépítő workshopon született, hanem egy terminálablakban.

Aki fejlesztőként dolgozik, naponta tucatszor gépeli be: mv, szóköz, fájlnév, szóköz, cél, Enter. Ennél egyszerűbb mozdulat alig van a gépen. A fájl ott van, ahová kérted, kérdés és visszaigazolás nélkül. Annyira megszokott, hogy az ember észre sem veszi.

Aztán jön a pillanat, amikor ugyanezt a fájlt nem egy másik mappába kell tenni, hanem valaki másnak kell odaadni. Egy ügyfélnek egy 2 GB-os videót, a nagymamának az esküvői fotókat, egy kollégának egy exportált adatbázist. És hirtelen vége az egyszerűségnek: a levelezőrendszer szerint túl nagy a csatolmány, a felhőtárhely regisztrációt kér a címzettől, a fájlküldő pedig egy hét múlva törli a linket, éppen akkor, amikor a címzett végre ráérne letölteni.

Innen jött a kérdés: miért nem lehet a fájlküldés is ilyen egyszerű, mint az mv? Egy forrás, egy cél, és kész. Csak itt a forrás a te géped, a cél pedig egy másik ember.

Az ötlet munkacímeként egyszerűen „file mv” szerepelt, vagyis a fájlmozgatás, ahogy egy Unix-felhasználó leírná. Volt egy kis nyelvi játék is benne: a terminálban a parancs jön előre (mv fájl), a szolgáltatásnál viszont a fájl a főszereplő, ezért megfordult a sorrend. A név sokáig csak a jegyzetekben élt így, szóközzel. Amikor aztán eljött az ideje, hogy a projekt rendes nevet kapjon, kiderült, hogy jobbat nem találunk: a „file mv”-ből kiesett a szóköz, és lett belőle FileMv.

A név azóta is pontosan azt mondja, amit a szolgáltatás csinál: fájlmozgatás. Annak, aki ismeri az mv-t, rögtön van egy kis kikacsintás benne, akinek pedig a terminál ismeretlen terep, annak is könnyen kimondható és megjegyezhető: fájl-em-vé.

Az mv három tulajdonságát szerettük volna átvenni:

  • Egy dolgot csinál. Az mv nem kér regisztrációt, nem kér metaadatot, csak egy forrást és egy célt. A FileMv-n is fiók nélkül feltölthetsz fájlonként 100 MB-ig, és rögtön kapsz egy linket. Ha többre van szükséged (fájlonként 5 GB, mappák, jelszó, e-mailes küldés), ahhoz egy ingyenes fiók kell, de az alap lépés ugyanaz marad.
  • Nem kérdez feleslegesen. Az mv nem kérdezi meg, biztos vagy-e benne, hogy át akarod tenni a fájlt. Feltöltéskor a FileMv sem kér kötelező címzettet vagy üzenetet, és nem kell érvényességi időt beállítanod, mert a link nem jár le.
  • A fájl ugyanaz marad. Az mv után a fájl tartalma bitre ugyanaz, mint előtte. A FileMv-re is az eredeti fájlt töltöd fel, és a címzett ugyanazt tölti le.

A kis v a névben pedig emlékeztető arra, honnan jöttünk: egy kétbetűs parancsra, amely 1971 óta ugyanazt csinálja, és még mindig nem kellett rajta semmit javítani.

Összefoglalva

Az mv 1971 óta része a Unixnak, és ma is ugyanazt csinálja: áthelyez és átnevez. Ugyanazon a lemezen belül csak a fájl nevét írja át, ezért azonnali és atomikus; két lemez között másol, majd töröl. Alapból szó nélkül felülír, ezért fontos fájloknál érdemes a -i, -n vagy --backup kapcsolóval dolgozni, szkriptekben pedig a -t, -T és -v teszi kiszámíthatóbbá. A FileMv neve is innen jön: a „file mv”, a fájlmozgatás munkacímből lett, és ennek a kétbetűs parancsnak a szellemében készült: egy fájl, egy cél, felesleges kérdések nélkül.

Gyakori kérdések

Az `mv` a *move* (áthelyez) angol szó rövidítése. Unix-szerű rendszereken (Linux, macOS, BSD) fájlok és könyvtárak áthelyezésére és átnevezésére szolgál. Alakja: `mv forrás cél`.

Utoljára frissítve:FileMv csapat

  • mv parancs linux
  • mv kapcsolók
  • linux fájl áthelyezés
  • fájl átnevezése linux
  • mv vs cp
  • unix parancsok
  • filemv jelentése

Kapcsolódó cikkek

Minden cikk →