Nel modo in cui funzionano i filesystem, una directory non è in realtà una cartella contenente file, ma piuttosto una directory è un file che contiene puntatori inode a file "figli" ad essa collegati. Significato, dal punto di vista del file system, un file è un file, ma una directory è solo un file contenente un elenco di file collegati.
Quindi dal punto di vista della riga di comando, facendo questo:
$ cp dir1 copyDir1
Significherebbe sostanzialmente copiare il file denominato, dir1
in un nuovo file denominato copyDir1
. E per quanto riguarda il file system, dir1
è comunque solo un file; il fatto che si tratti di una "directory" sarà evidente solo quando il filesystem verifica effettivamente dir1
che cosa sia effettivamente quel mucchio di bit.
Il -r
flag indica al file system di scorrere in modo ricorsivo l'albero dei file / directory e di copiare tutti i contenuti che potrebbero essere "figli" di quel file in una nuova posizione.
Ora sul perché ciò possa sembrare superfluo o ridondante, ciò si riduce davvero ai metodi storici di gestione dei file system. Oltre a creare un sistema sicuro da tutti i tipi di errori relativi all'utente; accidentale e intenzionale.
Significato, supponiamo che tu abbia un ~/bin
file nella tua home directory che vuoi copiare ma accidentalmente escluso il ~
—perché sei un essere umano e commetti errori — quindi è proprio /bin
così:
cp /bin/ ~/copy_of_bin
Con la "rete di sicurezza" di /bin
essere una directory unita alla necessità del -r
flag, eviterai di copiare accidentalmente l'intera radice binaria del sistema su cui ti trovi nella tua home directory. Se quella rete di sicurezza non esistesse, si verificherebbe un disastro minore, o forse maggiore.
La logica qui è che ai giorni devono essere impostate convenzioni logiche / comportamentali pre-GUI (interfacce utente grafiche) per evitare che l'utente abbia creato incidenti che possono potenzialmente uccidere un sistema. E l'uso della -r
bandiera ora è uno di questi.
Se questo sembra superfluo, non è necessario cercare oltre il moderno sistema di interfaccia grafica che si può collocare sopra i file system Linux. Una GUI risolve i problemi di base dell'utente come questo consentendo di trascinare e rilasciare file e directory con facilità.
Ma nel caso delle interfacce testuali, gran parte dell '"esperienza utente" all'interno di quel mondo è fondamentalmente solo dossi stradali logici e basati su hueristic che aiutano a tenere sotto controllo l'utente in modo da evitare il potenziale disastro.
Allo stesso modo, questo è il motivo per cui i filesystem Linux / Unix non hanno 777
permessi e sudo
diritti impostati di default e come gli amministratori di sistema reali sussultano quando un utente imposta 777
permessi o concede sudo
diritti a tutti . Queste sono le cose basilari che si fanno per garantire che il sistema sia stabile e il più “a prova dell'utente” possibile; chiunque si affretti a cortocircuitare quelle convenzioni molto probabilmente causerà danni al proprio sistema senza nemmeno saperlo.
INFORMAZIONI AGGIUNTIVE: Un'altra risposta qui sul sito Unix Stack Exchange fornisce una buona spiegazione del perché una copia non ricorsiva di una directory è problematica; l'enfasi è mia.
Bene, senza il flag -R, è possibile solo copiare i file, perché è piuttosto insolito che qualcuno voglia copiare una directory in modo non ricorsivo : una copia non ricorsiva comporterebbe solo un secondo nome per la directory, che punta direttamente al stessa struttura di directory.
Dato che raramente è ciò che la gente vuole, e in realtà esiste un programma separato che lo fa (ln), non è consentita una copia non ricorsiva di directory.
Quindi se una directory è solo un file con elementi inode al suo interno, fare una copia diretta di quel file sarebbe solo l'equivalente di come funzionerebbe un hard link. Che non è quello che qualcuno vuole.