En la forma en que funcionan los sistemas de archivos, un directorio no es en realidad una carpeta que contiene archivos, sino que un directorio es un archivo que contiene punteros de inodo a archivos "secundarios" conectados a él. Es decir, desde la perspectiva del sistema de archivos, un archivo es un archivo, pero un directorio es solo un archivo que contiene una lista de archivos conectados.
Entonces, desde la perspectiva de la línea de comando, haciendo esto:
$ cp dir1 copyDir1
Básicamente significaría copiar el archivo llamado dir1
a un nuevo archivo llamado copyDir1
. Y en lo que respecta al sistema de dir1
archivos, de todos modos es solo un archivo; el hecho de que sea un "directorio" solo será evidente cuando el sistema de archivos realmente verifique dir1
qué es realmente ese montón de bits.
La -r
bandera le dice al sistema de archivos que despliegue recursivamente el árbol de archivos / directorios y copie cualquier contenido que pueda ser un "hijo" de ese archivo a un nuevo lugar.
Ahora, por qué eso puede parecer superfluo o redundante, esto realmente se reduce a métodos históricos para tratar con sistemas de archivos. Además de crear un sistema que esté a salvo de todo tipo de errores relacionados con el usuario; accidental así como intencional.
Es decir, supongamos que tiene un ~/bin
archivo en su directorio de inicio que desea copiar pero que accidentalmente dejó de lado, ~
porque es un ser humano y comete errores, así que es /bin
así:
cp /bin/ ~/copy_of_bin
Con la "red de seguridad" de /bin
ser un directorio combinado con la necesidad del -r
indicador, evitará copiar accidentalmente toda la raíz binaria del sistema en el que se encuentra en su directorio de inicio. Si esa red de seguridad no existiera, ocurriría un desastre menor, o posiblemente mayor.
La lógica aquí es que en los días previos a las GUI (interfaces gráficas de usuario) las convenciones lógicas / de comportamiento deben establecerse para evitar que el usuario cree contratiempos que potencialmente pueden matar un sistema. Y usar la -r
bandera ahora es uno de ellos.
Si eso parece superfluo, entonces no necesita buscar más allá del sistema GUI moderno que uno puede colocar por encima de los sistemas de archivos Linux. Una GUI aborda problemas básicos del usuario como este al permitir arrastrar y soltar archivos y directorios con facilidad.
Pero en el caso de las interfaces basadas en texto, gran parte de la "experiencia del usuario" dentro de ese mundo es básicamente un bache de camino lógico y basado en huerística que ayuda a mantener al usuario bajo control para evitar posibles desastres.
De manera similar, esta es la razón por la cual los sistemas de archivos Linux / Unix no tienen 777
permisos y sudo
derechos establecidos de manera predeterminada y cómo los administradores de sistemas reales hacen una mueca cuando un usuario establece 777
permisos o otorga sudo
derechos a todos . Estas son las cosas básicas que uno hace para garantizar que el sistema sea estable y lo más "a prueba del usuario" posible; cualquiera que se apresure a cortocircuitar esas convenciones probablemente causará daños a su sistema sin siquiera saberlo.
INFORMACIÓN ADICIONAL: Otra respuesta aquí en el sitio Unix Stack Exchange da una buena explicación de por qué una copia no recursiva de un directorio es problemática; El énfasis es mío.
Bueno, sin el indicador -R, solo es posible copiar archivos, porque es bastante inusual que alguien quiera copiar un directorio de forma no recursiva : una copia no recursiva solo daría como resultado un segundo nombre para el directorio, apuntando directamente a misma estructura de directorio
Debido a que rara vez eso es lo que la gente quiere, y en realidad hay un programa separado que hace esto (ln), no se permite una copia no recursiva de directorios.
Entonces, si un directorio es realmente un archivo con elementos de inodo dentro de él, hacer una copia directa de ese archivo sería el equivalente de cómo funcionaría un enlace duro. Que no es lo que nadie quiere.