Una directory è (concettualmente) un "file" speciale che contiene un elenco di nomi e i numeri di inode a cui fanno riferimento questi nomi. Alcuni nomi possono essere sottodirectory. C'è una voce speciale ..
che punta alla directory principale.
Quindi, è chiaro, cambiare il nome di un file è facile: basta cambiare il nome nella voce della directory, nient'altro. Indica se il file è effettivamente un file o è un "file" utilizzato per archiviare il contenuto di un'altra directory. In effetti, la stessa rename
syscall fa entrambe le cose.
Copiare, tuttavia, è un'operazione molto meno banale. Si potrebbe basta copiare il "file" directory, ma poi si sarebbe avere due directory in cui sono i file sono gli stessi (che sarebbero collegamenti fisici). Se tu avessi un sistema che consenta hardlink alle directory, lo sarebbero, ma dal momento che nessun sistema moderno lo consente, almeno al non root, devi fare quella copia per ogni sottodirectory. Puoi effettivamente chiedere cp
questo comportamento con cp -lR
: -l
per hard link, -R
per quella ricorsione.
Ma lasciare tutto collegato non è probabilmente quello che vuoi. Invece, vuoi cp
copiare ogni file. È un'operazione piuttosto costosa: ogni file deve essere letto in memoria e riscritto sul disco in una seconda posizione. In realtà sono necessari diversi syscall per aprire, leggere, scrivere e chiudere i file, e questo deve essere ripetuto per ogni file.
I filesystem tradizionali funzionano in questo modo anche su disco. Non c'è modo di copiare un mucchio di file, se non quello di esaminarli singolarmente e copiarli, e questi sono i tipi di filesystem che erano in uso quando sono state progettate le utility di base della riga di comando.
mv
ing da un file system all'altro è lo stesso "basta cambiare il nome nella voce della directory"?