Кіріспе

Unix командалық утилитасы mv – бір немесе бірнеше файлдарды немесе каталогтарды бір орыннан екінші орынға жылжытатын Unix командасы. Егер екі файл аты да бір файлдық жүйеде болса, бұл файлды қарапайым қайта атауға әкеледі; әйтпесе файлдың мазмұны жаңа орынға көшіріледі және ескі файл жойылады. mv командасын пайдалану үшін пайдаланушының файлды жылжытатын каталогтарға жазу рұқсаты болуы керек. Себебі mv жылжыту кезінде екі каталогтың мазмұнын (яғни, бастапқы және мақсатты) өзгертеді. mv командасын бір файлдық жүйеде орналасқан файлдарда қолданғанда, файлдың уақыт белгісі жаңартылмайды. AT&T UNIX-тен туындаған UNIX жүйелерінде cp, ln және mv бір бағдарлама ретінде қатты байланысқан бинарлық файлдармен іске асырылады. Қолданылу жолы argv[0] арқылы таңдалады. Бұл – өте жақын қатысты командалар бірлік ретінде жинақталғанда, пайдаланушыға жоспарланған әрекеттің нақты бағытын таңдауға мүмкіндік беретін кең таралған тәсіл.

Тарих

Каталог жазбасын жаңа каталогқа жылжытатын команда алғаш рет Multics жүйесінде іске асырылды. Кейіннен бұл команда Unix 1 нұсқасында пайда болды және 1987 жылғы X/Open Portability Guide нұсқасының 2-ші бөлімінің құрамына кірді. GNU coreutils жинағындағы mv командасын Майк Паркер, Дэвид Маккензи және Джим Мейеринг жазған. Бұл команда IBM i операциялық жүйесіне де ауыстырылды.

Бар файлдың қайшылықтары

Файл атауы бар файлға жылжытылған кезде, қолданыстағы файл әдетте жойылады (сүртіледі). Егер қолданыстағы файл жазуға рұқсаты болмаса, бірақ жазуға рұқсаты бар каталогта орналасқан болса, mv командасы f (force) опциясы қолданылмаса, терминалдан орындалған жағдайда, жалғастыру алдында растау сұрайды. Кездейсоқ жазылып кетуді GNU n (толық пішімі: сүртілмеу) белгісін пайдалану арқылы болдырмауға болады. Басқаша айтқанда, u (жаңарту) тек бастапқы файлдардан ескі мақсатты файлдарды ғана жаңартады, i (интерактивті) әр атау қақтығысында растауды сұрайды, ал b (қосымша көшірме) мақсатты файлдарды басқа жерге жылдырып, қайта атайды. Файл атауы бар каталогқа жылжытылған кезде, осыған байланысты түсініксіздік туындайды. Әдетте, mv бұл әрекетті каталогтың ішіне атауды жылжытуға талпыныс ретінде қарастырады. GNU mv мұндай болжамды жоюға және керісінше, каталогты жазып үстіне шығуға тырысуға мүмкіндік беретін опцияны ұсынады. Кері операция каталогқа жылжу әрекетін нақтылайды.

Көшіру мен жоюға қарсы жылжыту

Бір файл жүйесіндегі файлдарды жылжыту, файлды көшіріп, түпнұсқасын жоюдан әдетте өзгеше іске асырылады. Қайта атау (rename) жүйелік шақыруын (syscall) қолдамайтын платформаларда, жаңа каталогқа жаңа сілтеме қосылады және бастапқысы жойылады. Файлдың деректеріне қол жеткізілмейді. Барлық POSIX стандартына сәйкес келетін жүйелер қайта атау шақыруын іске асырады. Нақты жылжыту (фактычески, қайта атау) көшіру және жылжыту процедурасынан едәуір жылдам. Файлдың i нөмірі ("inode number" дегеннің қысқартылған түрі) өзгермейді. "Көшіру" нәтижесінде өзгеретін каталогтағы ақпаратты жаңалау ғана болғандықтан, жылжытылатын файлды оқуға рұқсат қажет емес. Бастапқы және мақсатты каталогтар өңделіп жатқандықтан, яғни мақсатты каталогта жазбалар құрылып, бастапқы каталогтан жойылып жатқандықтан, жылжытуды аяқтау үшін екі каталогта да "жазу" рұқсаты қажет. Файлдарды бір файл жүйесінен екіншісіне жылжыту толығымен сәтсіз аяқталуы мүмкін немесе атомдық көшіру және жою операциясы ретінде автоматты түрде орындалуы мүмкін; нақты егжей-тегжейі жүзеге асыру тәсіліне байланысты. Бір аталық каталогты басқа аталық каталогқа жылжыту үшін, жылжытылатын каталогқа жазу рұқсаты, сондай-ақ ескі және жаңа аталық каталогтарды өңдеуге рұқсаттар қажет. Себебі, қайта атау нәтижесінде каталог жазуының i нөмірі (" " – ағымдағы каталогтың ата-анасының синонимі ретінде кез келген контексте қолданылуы мүмкін) өзгереді.

Мысалдар

Команданың түсіндірмесі mv myfile mynewfilename 'myfile' файлын 'mynewfilename' деп қайта атайды. mv myfile subdir/myfile 'myfile' файлын 'subdir/myfile' деп жылжытады. mv myfile subdir Бұл команда бұрынғы командамен бірдей, файл атауы автоматты түрде анықталады. mv be.03 /mnt/bkup/bes 'be.03' файлын 'bkup' деп аталған томның 'bes' каталогына көшіреді, содан кейін 'be.03' файлы жойылады. mv be.03/* /mnt/bkup/bes Жоғарыдағы командамен бірдей, бірақ 'be.03' каталогынан әрбір файл жеке-жеке көшіріліп, жойылады, барлық көшіру аяқталғаннан кейін бірден емес. mv afile another mydir бірнеше файлды 'mydir' каталогына жылжытады. mv /var/log/*z ~/logs Егер '/var' басқа файл жүйесінде орналасқан болса, бұл күткеннен ұзаққа созылуы мүмкін, себебі файлдар көшіріліп, содан кейін жойылады. Shell пайдаланушының бас каталогына ~ символын ауыстырады және * символын жол белгісі ретінде қарастырады. Ескеріңіз, жоғарыдағы мысалда /mnt каталогы файл жүйесі орнатылған жерді ("монтаждау нүктесін") білдіреді. Мұндай каталогтарды /mnt деп атау кең таралған, бірақ қажетті емес. "Файл жүйесін" логикалық тұрғыдан тәуелсіз ағаш ретінде қарастыруға болады; оның түбірі әкімші таңдаған каталогтың үстіне "орнатылады". Бұл каталогтың бұрынғы мазмұны жасырылады, бірақ жаңа томды ажыратқанда ол "қайта жаңартылады".