¿Por qué `mv file / dir` no mueve el archivo a un subdirectorio del directorio de trabajo actual?

10

Estaba en mi /etcdirectorio y escribí el comando

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

Pensé que movería el archivo al directorio openvpnque es un subdirectorio del /etcdirectorio. Sin embargo, eso no parece ser lo que sucedió. Todo lo que puedo confirmar es que el comando se ejecutó.

relámpago blanco
fuente

Respuestas:

51

Siempre que no exista un directorio con este nombre, cambió el nombre del archivo a openvpnubicado en su directorio raíz /. Para revertir esto, ejecute:

sudo mv /openvpn /etc/MyFile.conf

Si el directorio existía, movió el archivo dentro de él, entonces la reversión es:

sudo mv /openvpn/MyFile.conf /etc/

Para moverlo a un subdirectorio existente del directorio actual, puede ejecutar cualquiera de estos, que usan rutas relativas :

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

.es un enlace al directorio actual, por lo que ./al comienzo de una ruta significa "en este directorio". La barra diagonal al final significa que openvpnes un directorio y desea mover el archivo dentro de él. Si no se proporciona, el archivo se trasladó a ella si existe un directorio con este nombre, de lo contrario el archivo se cambió el nombre a openvpn. Con un /al final, mvle avisará si falta el directorio y no cambia el nombre, por lo que esa es la forma segura si no desea cambiar el nombre.

Si su ruta comienza /por otro lado, es una ruta absoluta independientemente del directorio de trabajo actual, siempre es relativa al directorio raíz /. Usando rutas absolutas para el archivo y el destino, su comando se vería así:

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

Otras lecturas

postre
fuente
2
Si no sabe si el directorio existió o no, intente sudo mv /openvpn/MyFile.conf /etc/primero con el comando. En el escenario probable, el directorio no existía, solo le dará un error (probablemente "No es un directorio") y no tocará el sistema de archivos. Entonces, solo puedes hacer sudo mv /openvpn /etc/MyFile.conf.
flarn2006
9

Necesitas usar

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

para mover el MyFile.confarchivo al openvpnsubdirectorio de /etc/.

Por otra parte

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

movería el archivo al /directorio como openvpn(es decir, renombra como openvpn) en su lugar (suponiendo que el /openvpndirectorio no exista).

pomsky
fuente
3
Además, la barra diagonal al final del primer comando es opcional. Pero supongo que es un buen hábito para entrar, ya que va a hacer que el comando falle si no es un directorio, en lugar de crear una situación confusa como se describe OP (o peor, de sobrescribir un archivo importante.)
flarn2006
4

Cuando mueve un archivo, le dice al sistema operativo el directorio en el que desea colocarlo o la nueva ruta que desea asignarle.

Le dijiste al sistema operativo "/ openvpn". Así que va a hacer exactamente eso: verifique si / openvpn existe (es decir, un objeto llamado "openvpn" ubicado en el directorio raíz) y es un directorio, y si es así, mueva su archivo a él, o si / openvpn es un archivo o no existe, cambie el nombre y mueva su archivo para que ahora sea accesible como / openvpn.

Lo que quería que hiciera era moverlo dentro de un directorio "openvpn", que se encuentra en su directorio actual , no uno que esté en el directorio raíz del sistema de archivos (que es lo que significa el "/" inicial). Así que tenía que apuntar a ese directorio en el comando mover, no a la ruta absoluta "/ openvpn". Cualquiera de estos funcionará:

  • mv MyFile.conf openvpn - busca en mi directorio actual este "openvpn"
  • mv MyFile.conf /etc/openvpn - busque la ruta absoluta / etc / openvpn
  • mv MyFile.conf openvpn/ - mira en mi directorio actual, para un directorio llamado openvpn
  • mv MyFile.conf ./openvpn - hace que el "directorio actual" sea aún más obvio

Versión corta: probablemente usó "/" para referirse a "mi directorio actual", por lo tanto "/ openvpn" para referirse a "openvpn que está en mi directorio actual". Pero un "/" inicial solo significa "el directorio raíz", por lo que "/ openvpn" significa "openvpn en el directorio raíz". Lo que necesitaba era simplemente usar "openvpn" o "openvpn /", que significa "openvpn en mi directorio actual ".

Stilez
fuente
1
No estoy seguro de por qué esta respuesta fue rechazada; ¡es correcto y realmente creo que es el más claro!
Carreras de ligereza en órbita
1

Cualquier ruta que comience con /una ruta absoluta, no relativa.

Si todas las rutas fueran siempre relativas al directorio actual, ¿cómo lo haría cd /etcen primer lugar? Tendría que hacerlo cd ../../../../../etcy esperar que haya suficientes niveles de .., o simplemente siga haciéndolo cd ..hasta que llegue al directorio raíz.

O necesitaría alguna otra sintaxis para expresar rutas absolutas. Pero Unix decidió el /significado absoluto, cualquier otra cosa relacionada con el directorio de trabajo actual del proceso. Así mv MyFile.txt openvpnfuncionaría.


Y no, no funcionaría bien inferir absoluto versus relativo a partir de archivos existentes o no. No queremos mkdirque las llamadas al sistema traten las rutas de manera diferente chdiro las renamellamadas al sistema, y ​​hacer que el mvprograma lo haga solo deja espacio para la inconsistencia entre mvy algún otro programa que tome un nombre de archivo de salida.

mvya es especial porque cuando el rename()destino es un directorio, agrega el nombre del archivo de origen a ese directorio de destino e intenta nuevamente. Pero tenga en cuenta que una estrategia de implementación simple se basa en que la primera rename()llamada del sistema falla con EEXISTo EISDIR. Entonces tenemos que saber si una ruta es relativa o absoluta antes de verificar el sistema de archivos.

(Early Unix se ejecutó en computadoras lentas, donde las verificaciones adicionales si existía un directorio podrían significar E / S adicionales si no estaba en caché, o más presión sobre el almacenamiento en caché de directorios. Pero creo que los argumentos de cordura / corrección son suficientes para explicar por qué su primera suposición no era una forma plausible para que el sistema funcionara, sin recurrir a argumentos históricos de eficiencia).

Peter Cordes
fuente
1

Para completar las otras respuestas:

mv file.txt /location

es lo mismo que para Windows

mv file.txt c:\location

El sistema de archivos en Linux está pensado de acuerdo con el estándar de jerarquía del sistema de archivos , o FHS para abreviar. le ayuda a saber dónde debe colocarse un archivo según su naturaleza y contenido.

La primera carpeta (equivalente a c:en Windows) es /.

Pierre-Antoine Guillaume
fuente