Почему `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каталог не существует).

pomsky
источник
3
Кроме того, косая черта в конце первой команды является необязательной. Но я полагаю, что это хорошая привычка, так как она приведет к сбою команды, если она не является каталогом, вместо создания запутанной ситуации, как описано в OP (или, что еще хуже, перезаписи важного файла).
flarn2006
4

Когда вы перемещаете файл, вы указываете ОС каталог, в который вы хотите поместить его, или новый путь, который вы хотите указать.

Вы сказали ОС "/ openvpn". Так что он собирается сделать именно это - проверить, существует ли / openvpn (имеется в виду объект с именем "openvpn", расположенный в корневом каталоге) и является ли каталогом, и если это так, переместите в него свой файл, или же если / openvpn является файлом или не существует, переименуйте и переместите файл, чтобы он был доступен как / openvpn.

То, что вы хотели сделать, это переместить его в каталог "openvpn", который находится в вашем текущем каталоге , а не в корневой каталог файловой системы (именно это означает начальный символ "/"). Таким образом, вам нужно было указать на этот каталог в команде перемещения, а не на абсолютный путь "/ openvpn". Любой из них будет работать:

  • mv MyFile.conf openvpn - посмотрите в моем текущем dir для этого "openvpn"
  • mv MyFile.conf /etc/openvpn - ищите абсолютный путь / etc / openvpn
  • mv MyFile.conf openvpn/ - посмотрите в моем текущем dir, для dir под названием openvpn
  • mv MyFile.conf ./openvpn - делает «текущий каталог» еще более очевидным

Короткая версия - вы, вероятно, использовали «/» для обозначения «моего текущего каталога», поэтому «/ openvpn» для обозначения «openvpn, который находится в моем текущем каталоге». Но ведущий «/» всегда означает «корневой каталог», поэтому «/ openvpn» означает «openvpn в корневом каталоге». Вам нужно было просто использовать «openvpn» или «openvpn /», что означает «openvpn в моем текущем каталоге ».

Stilez
источник
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) есть /.

Пьер-Антуан Гийом
источник