Perché non riesco a rimuovere "." directory?


40

Ho provato a rimuovere il '.' directory. Pensavo di poter semplicemente cancellare la mia directory di lavoro senza dover andare in una directory padre.

Il punto della mia domanda è quello di cercare alcune informazioni su come funziona il sistema Linux per eliminare i file.


1
Prova rm -r 'pwd' per rimuovere la
directory

7
Questa domanda non duplica quella. Quello si chiede perché il legame reale esista come entità fisica, piuttosto che essere sintetizzato. Questa domanda non solo chiede perché rm .e rmdir .non funziona, ma perché sono specificati come non funzionanti, il che è indipendente dall'esistenza fisica di un hard link.
JdeBP,

9
Immagine che hai scalato su un albero per tagliare un ramo. Su quale lato del taglio ti siedi quando inizi a vedere? (Questo è il file system Linux in breve.)
michael

7
Immagina di fare rm -rf .*solo per trovare questo incluso non solo .ma anche .., e poi ../.., e poi ...
Gerrit,

Risposte:


89

La rimozione della directory corrente non influisce sull'integrità del file system o sulla sua organizzazione logica. La prevenzione della .rimozione viene eseguita per seguire lo standard POSIX indicato nella rmdir(2)pagina del manuale:

Se l'argomento path si riferisce a un percorso il cui componente finale è punto o punto-punto, rmdir () fallirà.

Una motivazione si trova nella rmpagina del manuale:

L'utilità rm è vietata per rimuovere i nomi punto e punto-punto al fine di evitare le conseguenze di fare inavvertitamente qualcosa del tipo:

rm -r. *

D'altra parte, la rimozione esplicita della directory corrente (ovvero indicando il suo percorso completo o relativo) è un'operazione consentita in Unix, almeno da SVR3 poiché era vietata con Unix versione 7 fino a SVR2. Questo è molto simile a ciò che accade quando si rimuove un file che viene attivamente letto o scritto. I processi che accedono al file di eliminazione continuano le loro operazioni di lettura e scrittura come se non fosse successo nulla. Dopo aver rimosso una directory corrente del processo, questa directory non è più accessibile tramite il suo percorso ma il suo inode rimane presente sul file system fino a quando il processo non termina o cambia la propria directory.

Nota che il processo non sarà in grado di usare un percorso relativo alla sua directory corrente per cambiare il suo cwd (es. cd ..) Perché non c'è più una ..voce nella sua directory corrente.

Quando il tipo di qualcuno rmdir ., che probabilmente si aspettano la voce di directory corrente da rimuovere, ma quando una directory viene rimossa (usando il suo percorso), tre voci di directory sono in realtà rimossi, ., .., e la directory stessa.

Rimuovere solo .e non la voce di directory di questa directory creerebbe una directory non conforme ma, come già detto, è vietato dallo standard.

Come giustamente sottolineato da @Emmanuel, c'è un secondo motivo per cui la rimozione .non è consentita. Esiste almeno un sistema operativo compatibile POSIX (Mac OS X con HFS +) che, con forti restrizioni, supporta la creazione di collegamenti diretti a directory esistenti. In tal caso, non esiste un modo chiaro dall'interno della directory per sapere quale hardlink è quello che dovrebbe essere rimosso.


9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "Il significato dell'eliminazione di pathname / dot non è chiaro, perché il nome del file (directory) nella directory padre da rimuovere non è chiaro, in particolare in presenza di più collegamenti a una directory "
Emmanuel,

@Emmanuel La rimozione di una directory che ha più di due collegamenti (ovvero non è vuota) è già vietata dalla progettazione (directory non vuota). Una directory con un numero di collegamenti pari a uno è vietata dallo standard (almeno con i file system in cui i conteggi dei collegamenti hanno un significato).
jlliagre,

3
@jlliagre: non si tratta di una directory contenente più collegamenti, ma di una directory con più collegamenti. Alcuni filesystem e / o sistemi operativi non lo consentono, ma non tutti.
Jörg W Mittag,

@ JörgWMittag Una directory che contiene più directory ha più collegamenti in base alla progettazione, perché tutte le sue sottodirectory si ..collegano ad essa. Questo è il caso unico della link count > 2stragrande maggioranza dei sistemi operativi e dei file system, pertanto "alcuni file system e / o sistemi operativi" è un eufemismo. L'unica eccezione nota non storica è Mac OS X con HFS + che aggiunge restrizioni su chi e cosa si può fare. Concesso il commento POSIX è diretto a questa stranezza. Vedi unix.stackexchange.com/questions/22394/…
jlliagre

Ehi, l'ho già fatto rm -r .*prima e ha spazzato via ricorsivamente tutto nella directory principale ... È stato più di un decennio o due fa, ma è bello sapere che rmnon lo consente più.
antak,

9

È fatto in questo modo per integrità poiché al momento ci si trova all'interno di quella directory ed .è solo un riferimento personale.

Devi andare nel suo genitore o chiamare rmdircon il suo percorso, che può essere fatto con:

rmdir `pwd`

Se ne hai spesso bisogno, puoi impostare un alias come:

alias rmc='rmdir `pwd`'

.. che potrebbe essere chiamato come rmcsolo per rimuovere la directory corrente.


13
Ma perché / in che modo l'ipotetico rmdir .comando compromette l'integrità del file system in un modo rmdir $(pwd)o rmdir "$PWD"no?
G-Man dice "Reinstate Monica" il

4
Non si tratta di integrità di FS ma di organizzazione logica. Quando hai scelto la tua directory corrente, dici alla shell di usare questa directory per le tue prossime operazioni, ma non puoi rimuovere qualcosa da se stessa.
Julie Pelletier,

7
Temo che sia congetturale.
Emmanuel,

4
@FranklinPiat Non ho trovato il tuo commento particolarmente utile: 1. Dove ha usato l'OP rm *, e cosa intendi con cronologia della shell? 2. La risposta riguardava la parte del perché , 3. Cura di elaborare?
JBentley,

4
@G-Man, se lo fai rmdir $(pwd), trova pwdun nome logico per la directory corrente, per esempio /foo/bar/baz, e poi rmdir, vedendo quel percorso, rimuove la bazvoce dalla /foo/bardirectory, a condizione che siano soddisfatte le condizioni. Questo ha senso. Il comando rmdir ., d'altra parte, è un'istruzione per rimuovere la .voce dalla directory corrente, che non è né consentita (violerebbe il vincolo che ogni directory ha una .voce che punta a se stessa) né utile (non rimuove il collegamento si volevate rimosso).
Hobbs,
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.