Come rinominare il file in .. (punto punto)?


26

Apparentemente puoi rinominare il file in... .

Se fossi pazzo, come rinominerei il file ..o .? È consentito anche un tale nome di file?

La barra rovesciata non sembra disabilitare il significato speciale del punto:

$ mv test \.
mv: `test' and `./test' are the same file

11
.ed ..esiste già. E il punto non ha un significato speciale.
ctrl-alt-delor

2
Mi chiedo se sia possibile creare file denominati .o ..da Windows su supporti esterni FATo NTFSmultimediali, quindi provare a montarli su un sistema basato su Unix. Hm ...
IQAndreas

3
@IQAndreas no, utilizza Windows. e ... allo stesso modo ( superuser.com/a/571364/330318 ) di Unix. (E diamine molti altri nomi speciali: superuser.com/a/217526/330318 )
PTwr

2
@PTwr La storia di Windows è più complicata di così. Alcune cose speciali accadono a livello di file system / livello API NT, alcune nel sottosistema Win32 e altre e livello shell. Ad esempio, la magia GUID del tuo secondo collegamento è a livello di shell, quindi non li vedrai in una tipica applicazione da riga di comando. Non sono sicuro se .ed ..effettivamente esistano in NTFS e nell'API NT o se vengono aggiunti solo dall'API Win32. So che ci sono diverse discrepanze tra l'API NT di livello inferiore e Win32, ad esempio Win32 nasconde diversi file dalla radice dell'unità.
Codici InCos

@CodesInChaos per quanto ne so dot / dotdot sono istanze virtuali e sono emulate nel driver del file system, ed era lo stesso nel vecchio FAT che prendeva in prestito l' idea ( problematica ) da Unix. Come al secondo link, ammetto di non averlo letto completamente prima di pubblicare. Qualcosa di simile a questo si sarebbe probabilmente meglio. (ma di nuovo, questo manca di informazioni complete ./ ..)
PTwr

Risposte:


25

.. non è speciale, è solo che esiste già.

Su Unix, Dos e MS-Windows ogni directory ha una directory .che ricollega a se stessa e una directory ..che collega alla sua directory principale (o self se la directory principale).

Se ..e .sono speciali è solo perché non è possibile rimuoverli (in realtà è possibile, basta rimuovere la directory che li contiene).

Pertanto non è possibile nominare alcun (altro) file .o ...

Tuttavia è possibile creare file ..., \, , .. (nota c'è uno spazio dopo il .., ma difficilmente si può vedere qui, o facilmente in te elenco di directory) o qualsiasi altro nome ti piace; L' unico carattere riservato è /(Attenzione - dettagli avanzati: e null, null è un carattere speciale, non utilizzato per altro che per segnare la fine delle cose e talvolta come separatore). .non ha un significato speciale: non per i nomi dei file, il kernel o la shell, non ha bisogno di scappare. In realtà se un nome file inizia con un .allora è speciale, il file è normalmente nascosto, ma non ha ancora bisogno di scappare.

A parte

Questo comportamento di file nascosto è nato in un'implementazione iniziale di lsdove l'autore voleva nascondere .e .., quindi, hanno scritto codice per nascondere tutti i file che iniziano con a .. Altri utenti hanno notato questo bug / funzionalità e hanno iniziato a creare file a partire da .quando volevano che il file fosse nascosto.

Spiegazione della domanda collegata

Nella domanda che si collega all'interrogatore sta cercando di spostare il file nella directory principale ..ma finisce per rinominarlo ..., i file che iniziano con un punto sono nascosti per impostazione predefinita, ecco perché non riescono a trovarlo.

Quando si utilizza mv nel modulo mv a b

  • Se ci si sposta .è effettivamente un'operazione nulla, ma mvlo considera un errore.
  • Se ci ..si sposta, il file verrà spostato nella directory principale.

1
Cosa intendi con If you move to . it is effectively a no operation? Non è un "no op", è un errore se si tenta di spostare un file da A a B quando A e B sono la stessa cosa. Dimostrazione più pratica di questo errore è mv foo ../some_dir/fooo mv foo some_subdir/../foo.
Brandin,

7
Per alcune definizioni di "carattere", NUL (0x00) non può essere utilizzato nei nomi di file e directory.
user117529

1
La distinzione tra carattere riservato (es / e NUL) e nome riservato (ie .e ..) potrebbe essere resa più chiara. Vale anche la pena sottolineare che .all'inizio del nome ha un significato speciale solo a livello di applicazione e non nell'API di chiamata del kernel o del sistema.
Kasperd,

Penso che il tuo spazio si sia perso.
nyuszika7h,

1
..e . sono speciali: non puoi spostarli o rimuoverli. Ma non sono speciali quando si spostano i file su di essi.
reinierpost,

52

Non è possibile rinominare un file .o ..perché tutte le directory contengono già voci per questi due nomi. (Queste voci puntano alle directory e non è possibile rinominare un file in una directory.)

mv rileva il caso in cui la destinazione è una directory esistente e la interpreta come una richiesta per spostare il file in quella directory (usando il suo nome attuale).

Le barre rovesciate non hanno nulla a che fare con questo, perché .non è un metacarattere shell. \.e .sono uguali a bash.


9

Il problema è che stai spostando un file in una directory. Questo è permesso fallire.

Ti dirò com'era una volta.

mkdir era solito leggere questo (mentre sto scrivendo questo in sh, è stato davvero scritto in C e setuid-root).

mknod d $1
ln -d $1 $1/.
ln -d `dirname $1` $1/..

Quindi, come puoi vedere, non c'è molto di speciale. e ... tranne per il fatto che sono stati creati per te da mkdir ed esistono già. C'è un codice ora che dice che non puoi rimuoverli, ma non è sempre stato così.

rmdir era simile a questo:

rm -d $1/..
rm -d $1/.
rm -d $1

+1 per la lezione di storia e aggiunta di qualcosa non adeguatamente coperto.
ctrl-alt-delor
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.