Чому `mv file / dir` не переміщує файл у підкаталог поточного робочого каталогу?


10

Я був у своєму /etcкаталозі і набрав команду

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

Я думав, що це перемістить файл у каталог, openvpnякий є підкаталогом /etcкаталогу. Однак, здається, це не було. Все, що я можу підтвердити, - це те, що команда була виконана.

Відповіді:


51

Якщо каталог з цим ім'ям не існує, ви перейменували файл у openvpnрозміщений у вашій кореневій директорії /. Щоб відновити це, запустіть:

sudo mv /openvpn /etc/MyFile.conf

Якщо каталог існував, ви перемістили файл всередині нього, то реверсія:

sudo mv /openvpn/MyFile.conf /etc/

Щоб перемістити його до існуючого підкаталогу поточного каталогу, ви можете запустити будь-який із них - вони використовують відносні шляхи:

mv MyFile.conf openvpn
mv MyFile.conf openvpn/
mv MyFile.conf ./openvpn
mv MyFile.conf ./openvpn/

.є посиланням на поточний каталог, тому ./на початку шляху означає "у цьому каталозі". Нахил на кінці означає, що openvpnце каталог, і ви хочете перемістити файл всередині нього. Якщо ви не надаєте його, файл буде переміщений до нього, якщо існує каталог з цим іменем, інакше файл буде перейменований у openvpn. З в /кінцем, mvпопередить вас, якщо каталог відсутній і не перейменований, тому це безпечний спосіб, якщо ви не хочете перейменувати.

Якщо ваш шлях починається з /іншого боку, це абсолютний шлях незалежно від поточного робочого каталогу, це завжди відносно кореневого каталогу /. Використовуючи абсолютні шляхи як до файлу, так і до пункту призначення, ваша команда виглядатиме так:

mv /etc/MyFile.conf /etc/openvpn
mv /etc/MyFile.conf /etc/openvpn/

Подальше читання


2
Якщо ви не знаєте, чи існував каталог чи ні, спробуйте sudo mv /openvpn/MyFile.conf /etc/спочатку команду. У ймовірному сценарії цього каталогу не існувало, воно просто дасть вам помилку (можливо, "Не каталог") і не торкнеться файлової системи. Тоді, ви можете просто зробити sudo mv /openvpn /etc/MyFile.conf.
flarn2006

9

Вам потрібно використовувати

me@mylaptop:/etc$ sudo mv MyFile.conf openvpn/

щоб перемістити MyFile.confфайл у openvpnпідкаталог /etc/.

З іншого боку

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

перемістить файл у /каталог як openvpn(тобто перейменувати як openvpn) замість цього (якщо /openvpnкаталог не існує).


3
Також коса риса в кінці першої команди є необов'язковою. Але я думаю, що це корисна звичка входити, оскільки це призведе до відмови команди, якщо це не каталог, а не створення заплутаної ситуації, як описано ОП (або ще гірше, перезапис важливого файлу.)
flarn2006

4

Переміщуючи файл, ви повідомляєте ОС директорію, в яку ви хочете його поставити, або новий шлях, який ви хочете надати.

Ви сказали ОС "/ openvpn". Отже, це точно зробимо - перевірте, чи існує / openvpn (тобто об'єкт, який називається "openvpn", що знаходиться в кореневій директорії), і чи це каталог, і якщо так, перемістіть у нього свій файл, або ще якщо if / openvpn є файлом або не існує, перейменуйте та перемістіть файл, щоб він тепер був доступний як / openvpn.

Ви хотіли це зробити - перемістити його в каталог "openvpn", який слід знайти у вашому поточному каталозі , а не в корінний каталог файлової системи (що означає провідний "/"). Тож вам довелося вказати на цей dir у команді move, а не на абсолютний шлях "/ openvpn". Будь-який із них буде працювати:

  • mv MyFile.conf openvpn - подивіться в моєму поточному реєстрі для цього "openvpn"
  • mv MyFile.conf /etc/openvpn - шукайте абсолютний шлях / etc / openvpn
  • mv MyFile.conf openvpn/ - подивіться в моєму поточному реєстрі, за dir під назвою openvpn
  • mv MyFile.conf ./openvpn - робить "поточний реж" ще більш очевидним

Коротка версія - ви, ймовірно, використовували "/", щоб означати "мій поточний каталог", тому "/ openvpn" означає "openvpn, який знаходиться в моєму поточному каталозі". Але провідна "/" означає лише коли-небудь "кореневу директорію", тому "/ openvpn" означала "openvpn у кореневому каталозі". Вам потрібно було просто використовувати "openvpn" або "openvpn /", що означає "openvpn в моєму поточному каталозі ".


1
Не впевнений, чому цю відповідь було оскаржено; це правильно, і я насправді думаю, що це найясніше!
Гонки легкості по орбіті

1

Будь-який шлях, який починається з /- це абсолютний шлях, а не відносний.

Якби всі шляхи завжди були відносно поточного каталогу, як би ви cd /etcв першу чергу? Вам доведеться cd ../../../../../etcсподіватися, що вистачало рівнів ..або просто продовжувати робити, cd ..поки ви не потрапите до кореневого каталогу.

Або вам знадобиться інший синтаксис, щоб виразити абсолютні шляхи. Але Unix визначився з /абсолютним значенням, що стосується поточного робочого каталогу процесу. Так mv MyFile.txt openvpnби працювало.


І ні, не було б добре зробити висновок про абсолютний та відносний відносно існуючих чи ні файлів. Ми не хотіли б mkdirсистемні виклики , щоб лікувати по- різному доріжках від chdirабо renameсистемних викликів, і роблячи mvпрограму робити це тільки залишає за неузгодженості mvі деякою іншою програмою , яка приймає ім'я вихідного файлу.

mvє вже особливим, оскільки, коли rename()адресатом є каталог, він додає ім'я вихідного файлу до цього каталогу призначення та повторює спробу. Але зауважте, що одна проста стратегія реалізації покладається на те, що перший rename()системний виклик не працює з EEXISTабо EISDIR. Тому ми повинні знати, чи шлях відносний чи абсолютний, перш ніж перевірити файлову систему.

(Ранній Unix працював на повільних комп’ютерах, де додаткові перевірки, чи існує каталог, можуть означати додаткові введення / виведення, якщо він не кешований, або більше тиску на кешування каталогів. Але я думаю, що аргументи розумності / коректності є достатніми, щоб пояснити, чому ваша перша здогадка не був правдоподібним способом роботи системи, не вдаючись до історичних аргументів ефективності.)


1

Щоб виконати інші відповіді:

mv file.txt /location

те саме, що і для Windows

mv file.txt c:\location

Файлової системи в Linux , як вважають , у відповідності з стандартом файлової ієрархії , або FHS для стислості. це допомагає вам знати, де слід розміщувати файл залежно від його характеру та вмісту.

Перша папка (еквівалентна c:в Windows) /.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.