Por que o `mv file / dir` não move o arquivo para um subdiretório do diretório de trabalho atual?

10

Eu estava no meu /etcdiretório e digitei o comando

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

Eu pensei que iria mover o arquivo para o diretório openvpnque é um subdiretório do /etcdiretório. No entanto, isso não parece ser o que aconteceu. Tudo o que posso confirmar é que o comando foi executado.

iluminação branca
fonte

Respostas:

51

Desde que um diretório com esse nome não exista, você renomeou o arquivo para openvpnlocalizado em seu diretório raiz /. Para reverter isso, execute:

sudo mv /openvpn /etc/MyFile.conf

Se o diretório existisse, você moveu o arquivo dentro dele, a reversão é:

sudo mv /openvpn/MyFile.conf /etc/

Para movê-lo para um subdiretório existente do diretório atual, você pode executar qualquer um destes - esses usam caminhos relativos :

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

.é um link para o diretório atual; portanto, ./no início de um caminho significa "neste diretório". A barra no final significa que openvpné um diretório e você deseja mover o arquivo dentro dele. Se você não fornecê-la, o arquivo será movido para ele, se um diretório com este nome existe, então o arquivo será renomeado para openvpn. Com um /no final, mvavisará se o diretório está ausente e não será renomeado, de modo que é o caminho seguro se você não quiser renomear.

Se o seu caminho começa com, /por outro lado, é um caminho absoluto, independentemente do diretório de trabalho atual, é sempre relativo ao diretório raiz /. Usando caminhos absolutos para o arquivo e o destino, seu comando ficaria assim:

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

Leitura adicional

sobremesa
fonte
2
Se você não souber se o diretório existe ou não, tente o sudo mv /openvpn/MyFile.conf /etc/comando primeiro. No cenário provável, o diretório não existia, apenas apresentava um erro (provavelmente "Não é um diretório") e não tocava no sistema de arquivos. Então, você pode simplesmente fazer sudo mv /openvpn /etc/MyFile.conf.
flarn2006
9

Você precisa usar

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

para mover o MyFile.confarquivo para o openvpnsubdiretório de /etc/.

Por outro lado

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

moveria o arquivo para o /diretório como openvpn(ou seja, renomeie como openvpn) em vez disso (assumindo que o /openvpndiretório não exista).

pomsky
fonte
3
Além disso, a barra no final do primeiro comando é opcional. Mas acho que é um bom hábito entrar, pois ele fará com que o comando falhe se não for um diretório, em vez de criar uma situação confusa como a OP descrita (ou pior, substituindo um arquivo importante.)
flarn2006
4

Ao mover um arquivo, você informa ao sistema operacional o diretório em que deseja colocá-lo ou o novo caminho que deseja atribuir.

Você disse ao sistema operacional "/ openvpn". Então, será feito exatamente isso - verifique se / openvpn existe (ou seja, um objeto chamado "openvpn" localizado no diretório raiz) e é um diretório; se for, mova seu arquivo para ele, ou se / openvpn é um arquivo ou não existir, renomeie e mova seu arquivo, para que agora seja acessível como / openvpn.

O que você queria fazer era movê-lo para um diretório "openvpn", que pode ser encontrado no diretório atual , e não no diretório raiz do sistema de arquivos (que é o que significa "/" principal). Então você tinha que apontar para esse diretório no comando move, não para o caminho absoluto "/ openvpn". Qualquer um destes irá funcionar:

  • mv MyFile.conf openvpn - procure no meu diretório atual por este "openvpn"
  • mv MyFile.conf /etc/openvpn - procure o caminho absoluto / etc / openvpn
  • mv MyFile.conf openvpn/ - procure no meu diretório atual, por um diretório chamado openvpn
  • mv MyFile.conf ./openvpn - torna o "diretório atual" ainda mais óbvio

Versão curta - você provavelmente usou "/" para significar "meu diretório atual", portanto "/ openvpn" significa "openvpn que está no meu diretório atual". Mas um "/" inicial significa apenas "o diretório raiz", então "/ openvpn" significava "openvpn no diretório raiz". O que você precisava era simplesmente usar "openvpn" ou "openvpn /", significando "openvpn no meu diretório atual ".

Stilez
fonte
1
Não sei por que essa resposta foi votada; está correto e eu realmente acho que é o mais claro!
Lightness Races in Orbit
1

Qualquer caminho que começa com /é um caminho absoluto, não relativo.

Se todos os caminhos fossem sempre relativos ao diretório atual, como você cd /etcem primeiro lugar? Você precisaria cd ../../../../../etce esperaria que houvesse níveis suficientes de .., ou continue fazendo cd ..até chegar ao diretório raiz.

Ou você precisaria de outra sintaxe para expressar caminhos absolutos. Mas o Unix decidiu ter um /significado absoluto, sendo qualquer outra coisa relativa ao diretório de trabalho atual do processo. Então mv MyFile.txt openvpnfuncionaria.


E não, não funcionaria bem para inferir absoluto vs. relativo de arquivos existentes ou não. Não queremos mkdirque as chamadas do sistema tratem os caminhos de maneira diferente chdirou as renamechamadas do sistema, e fazer com que o mvprograma faça isso apenas deixa espaço para inconsistência entre mve algum outro programa que usa um nome de arquivo de saída.

mvjá é especial porque quando o rename()destino é um diretório, ele anexa o nome do arquivo de origem ao diretório de destino e tenta novamente. Mas observe que uma estratégia simples de implementação depende da primeira rename()chamada do sistema falhar com EEXISTou EISDIR. Portanto, precisamos saber se um caminho é relativo ou absoluto antes de verificar o sistema de arquivos.

(O Unix inicial era executado em computadores lentos, onde verificações extras se um diretório existia poderiam significar E / S extra se não estivesse armazenado em cache, ou mais pressão no cache do diretório. Mas acho que os argumentos de sanidade / correção são suficientes para explicar por que sua primeira tentativa não era uma maneira plausível para o sistema funcionar, sem recorrer a argumentos históricos de eficiência.)

Peter Cordes
fonte
1

Para completar as outras respostas:

mv file.txt /location

é o mesmo que, para Windows

mv file.txt c:\location

O sistema de arquivos no linux é pensado de acordo com o padrão de hierarquia do sistema de arquivos , ou abreviado FHS . ajuda a saber onde um arquivo deve ser colocado, dependendo de sua natureza e conteúdo.

A primeira pasta (equivalente a c:no Windows) é /.

Pierre-Antoine Guillaume
fonte