Perché `mv file / dir` non sposta il file in una sottodirectory della directory di lavoro corrente?


10

Ero nella mia /etcdirectory e ho digitato il comando

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

Ho pensato che avrebbe spostato il file nella directory openvpnche è una sottodirectory della /etcdirectory. Tuttavia, non sembra essere quello che è successo. Tutto quello che posso confermare è che il comando è stato eseguito.

Risposte:


51

Se non esiste una directory con questo nome, il file è stato rinominato openvpnnella directory principale /. Per ripristinare questo, eseguire:

sudo mv /openvpn /etc/MyFile.conf

Se la directory esiste, hai spostato il file al suo interno, quindi l'inversione è:

sudo mv /openvpn/MyFile.conf /etc/

Per spostarlo in una sottodirectory esistente della directory corrente è possibile eseguire uno di questi - quelli utilizzano percorsi relativi :

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

.è un collegamento alla directory corrente, quindi ./all'inizio di un percorso significa "in questa directory". La barra alla fine indica che si openvpntratta di una directory e si desidera spostare il file al suo interno. Se non si forniscono di esso, il file verrà spostato in se una directory con questo nome esiste, altrimenti il file verrà rinominato a openvpn. Con /a alla fine, mvti avviserà se la directory è mancante e non rinomina, quindi è il modo sicuro se non vuoi rinominare.

Se invece il tuo percorso inizia con /un percorso assoluto , indipendentemente dalla directory di lavoro corrente, è sempre relativo alla directory principale /. Usando percorsi assoluti sia per il file che per la destinazione, il tuo comando sarebbe simile al seguente:

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

Ulteriori letture


2
Se non sai se la directory esiste o meno, prova sudo mv /openvpn/MyFile.conf /etc/prima il comando. Nel probabile scenario la directory non esisteva, ti darà solo un errore (probabilmente "Not a directory") e non toccherà il filesystem. Quindi, puoi semplicemente fare sudo mv /openvpn /etc/MyFile.conf.
flarn2006,

9

Devi usare

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

per spostare il MyFile.conffile nella openvpnsottodirectory di /etc/.

D'altra parte

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

sposta invece il file nella /directory come openvpn(ovvero rinomina come openvpn) invece (supponendo che la /openvpndirectory non esista).


3
Inoltre, la barra alla fine del primo comando è facoltativa. Ma immagino sia una buona abitudine entrare, poiché farà fallire il comando se non è una directory, piuttosto che creare una situazione confusa come OP descritto (o peggio, sovrascrivere un file importante.)
flarn2006

4

Quando sposti un file, indichi al sistema operativo la directory in cui vuoi inserirlo o il nuovo percorso che vuoi assegnare.

Hai detto al sistema operativo "/ openvpn". Quindi farà esattamente questo: controlla se / openvpn esiste (significa che un oggetto chiamato "openvpn" si trova nella directory principale) ed è una directory, e in tal caso sposta il tuo file in essa, oppure se / openvpn è un file o non esiste, rinomina e sposta il tuo file, quindi ora è accessibile come / openvpn.

Quello che volevi che fosse fare era spostarlo all'interno di una directory "openvpn", che si trova nella directory corrente , non in quella che si trova nella directory principale del file system (che è ciò che significa "/" principale). Quindi hai dovuto puntare a quella dir nel comando move, non al percorso assoluto "/ openvpn". Ognuno di questi funzionerà:

  • mv MyFile.conf openvpn - cerca nella mia directory corrente questo "openvpn"
  • mv MyFile.conf /etc/openvpn - cerca il percorso assoluto / etc / openvpn
  • mv MyFile.conf openvpn/ - cerca nella mia directory corrente, una directory chiamata openvpn
  • mv MyFile.conf ./openvpn - rende la "directory corrente" ancora più ovvia

Versione breve - probabilmente hai usato "/" per indicare "la mia directory corrente", quindi "/ openvpn" significa "openvpn che è nella mia directory corrente". Ma un "/" iniziale significa sempre "la directory principale", quindi "/ openvpn" significa "openvpn nella directory principale". Quello che ti serviva era semplicemente usare "openvpn" o "openvpn /", che significa "openvpn nella mia directory corrente ".


1
Non sono sicuro del motivo per cui questa risposta è stata sottoposta a downgrade è corretto e in realtà penso che sia il più chiaro!
Corse della leggerezza in orbita,

1

Qualsiasi percorso che inizia con /è un percorso assoluto, non relativo.

Se tutti i percorsi fossero sempre relativi alla directory corrente, come faresti cd /etc? Dovresti cd ../../../../../etce speri che ci siano abbastanza livelli di .., o semplicemente continuare cd ..fino a quando non arriverai alla directory principale.

Oppure avresti bisogno di un'altra sintassi per esprimere percorsi assoluti. Ma Unix ha deciso di /voler dire assoluto, qualsiasi altra cosa sia relativa all'attuale directory di lavoro del processo. Quindi mv MyFile.txt openvpnfunzionerebbe.


E no, non avrebbe funzionato bene per dedurre assoluto o relativo dai file esistenti o meno. Non vorremmo che mkdirle chiamate di sistema a percorsi di trattare in modo diverso da chdiro renamesistema le chiamate, e rendendo il mvprogramma di farlo solo lascia spazio a incongruenza tra mve qualche altro programma che richiede un nome di file di output.

mvè già speciale perché quando la rename()destinazione è una directory, aggiunge il nome del file di origine a quella directory di destinazione e riprova. Ma nota che una semplice strategia di implementazione si basa sul rename()fallimento della prima chiamata di sistema con EEXISTo EISDIR. Quindi dobbiamo sapere se un percorso è relativo o assoluto prima di controllare il filesystem.

(I primi Unix funzionavano su computer lenti, dove ulteriori controlli sull'esistenza di una directory potevano significare I / O extra se non erano memorizzati nella cache, o maggiore pressione sulla memorizzazione nella cache delle directory. Ma penso che argomenti di sanità mentale / correttezza siano sufficienti per spiegare perché la tua prima ipotesi non era un modo plausibile per far funzionare il sistema, senza ricorrere ad argomenti di efficienza storica.)


1

Per completare le altre risposte:

mv file.txt /location

è lo stesso di Windows

mv file.txt c:\location

Il filesystem in Linux è pensato secondo lo standard della gerarchia dei filesystem , o in breve FHS . ti aiuta a sapere dove posizionare un file in base alla sua natura e al suo contenuto.

La prima cartella (equivalente a c:in Windows) è /.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.