Perché è rm -rf e non rmdir -rf


13

Sono sempre stato curioso di sapere perché il comando per eliminare tutto in una directory è rm -rf.

Perché non ci sono bandiere con cui fare la stessa cosa rmdir?

Non sarebbe più intuitivo utilizzare rmdirper le operazioni di directory?


9
rmdirrimuove le directory, rmrimuove. Perché sarebbe intuitivo rmdirrimuovere le non-directory?
Stéphane Chazelas,

5
Perché non lo è. Hai 40 anni di ritardo e stai facendo questa domanda e stai chiedendo alle persone sbagliate.
user207421

Risposte:


25

Nei primi Unix File System (almeno nei giorni V7 intorno al 1970) le directory venivano implementate come file speciali e solo root poteva usare la mknod(2)chiamata di sistema che le creava e solo root poteva unlink(2)un file speciale di directory.

Queste protezioni erano in atto per mantenere coerente la struttura del filesystem. Ad esempio, se un utente fosse autorizzato a scrivere in un file speciale di directory, potrebbe fare in modo che la propria directory padre ..punti a se stessa (in particolare il proprio i-node). Ciò creerebbe un riferimento circolare nel filesystem che sarebbe una cosa negativa. Naturalmente ci sono altre incongruenze che si potrebbero fare, questo è solo un chiaro esempio.

La coerenza è stata mantenuta dai programmi dello spazio utente come mkdir(1)e rmdir(1)che erano root Set-UID in modo che potessero effettuare chiamate di sistema privilegiate per conto di un utente non privilegiato. Quando veniva aggiunta la ricorsione rm(1), il comando remove veniva eseguito come UID corrente e quindi chiamava rmdir(1)esclusivamente per la rimozione di directory vuote. Questo è ancora un metodo piuttosto standard di elevazione delle autorizzazioni: non utilizzare più autorizzazioni di quelle necessarie.

Qualche tempo dopo mkdir(2)e rmdir(2)sono stati aggiunti come il loro sistema chiama ma la relazione tra rm(1)e rmdir(1)rimane.

Personalmente, trovo un po 'più soddisfacente rmdir junke so che il peggio che ho fatto è stato rimuovere una directory vuota.


1
Per quanto riguarda l'ultima frase: presumibilmente, se l'operazione di eliminazione ricorsiva fosse in corso rmdir, avrebbe comunque bisogno di un -rflag. ( rmdir -r junkinvece di rm -r junk, e funziona rmdir junkancora solo se la directory è vuota)
user253751

7

È storico. rmè stato creato per rimuovere i riferimenti ai file, è rmdirstato creato per rimuovere le directory, parallelamente a mkdir. Molti anni fa, Unix rmpoteva solo rimuovere le directory invocando rmdir. Inoltre non c'era una rmdir(2)chiamata di sistema, rmdirera un programma che chiamava unlink(2).

Riferimenti:


2

È solo una questione di opinione, ma rmrimuove i file mentre rmdirrimuove le directory. Una directory è un file, ma un tipo speciale di file, quindi ha senso rmrimuoverli, ma trattarli in modo speciale (cioè richiedere un'opzione aggiuntiva per abilitare la funzionalità). D'altra parte, non tutti i file sono directory, e non ha senso IMHO per rmdirrimuovere qualcosa che non è una directory.


1
In tal caso, perché non è possibile rmrimuovere una directory vuota (tranne che in modalità ricorsiva)?
user253751

Stesso motivo per cui non è possibile rimuovere una directory completa: richiede il -rflag per abilitare la funzione di file speciale della directory.
Darwin von Corax,

1
Ragionamento circolare lì ...
user253751

Direi che il mio ragionamento ha un'eccentricità >> 1 ...
Darwin von Corax,
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.