Esta respuesta revela que uno puede copiar todos los archivos, incluidos los ocultos, del directorio srcal directorio de la siguiente destmanera:
mkdir dest
cp -r src/. dest
No hay una explicación en la respuesta o en sus comentarios sobre por qué esto realmente funciona, y nadie parece encontrar documentación sobre esto tampoco.
Probé algunas cosas. Primero, el caso normal:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
Luego, con /.al final:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
Entonces, esto se comporta de manera similar a *, pero también copia archivos ocultos.
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file src_dir src_file
.y ..son enlaces duros adecuados como se explica aquí , al igual que la entrada del directorio en sí.
¿De dónde viene este comportamiento y dónde está documentado?

cpreferencia explica claramente cómocp -Rfunciona..y..son directorios como cualquier otro directorio, no hay nada mágico o misterioso en ellos.., y..no se comportan como otros directorios.Respuestas:
El comportamiento es un resultado lógico del algoritmo documentado para
cp -R. Ver POSIX , paso 2f:.y..son directorios, respectivamente, el directorio actual y el directorio padre. Ninguno de los dos es especial en lo que respecta al shell, por lo que ninguno se preocupa por la expansión, y el directorio se copiará, incluidos los archivos ocultos.*, por otro lado, se expandirá a una lista de archivos, y aquí es donde se filtran los archivos ocultos.src/.es el directorio actual dentrosrc, que es ensrcsí mismo;src/src_dir/..essrc_direl directorio padre, que es nuevamentesrc. Entonces, desde afuerasrc, sisrces un directorio, especificarsrc/.osrc/src_dir/..como el archivo fuentecpes equivalente y copiar el contenido desrc, incluidos los archivos ocultos.El punto de especificar
src/.es que fallará sisrcno es un directorio (o enlace simbólico a un directorio), mientrassrcque no lo haría. También copiará el contenido desrcsolo, sin copiarse asrcsí mismo; esto también coincide con la documentación:Entonces
cp -R src/. destcopia el contenido desrctodest/.(el archivo fuente está.ensrc), mientras quecp -R src destcopia el contenido desrctodest/src(el archivo fuente estásrc).Otra forma de pensar en esto es comparar la copia
src/src_dirysrc/., en lugar de compararsrc/.ysrc..se comporta comosrc_diren el primer caso.fuente
srccopiará el directoriodest,src/.copiará el contenido. Trataré de aclarar eso en la pregunta.src/.ysrc/*(nota, nosrc/.*);src/*no incluye archivos ocultos si globbing los ignora ...srccontienesrc/.pero significa que el directorio que contiene un directorio depende de cómo se nombre el directorio. Por supuesto, la existencia de los.enlaces de alguna manera significa que todos los directorios se contienen a sí mismos, pero eso podría no ser intuitivo para todos. En lugar de este comportamiento, uno también podría verse tentado a suponer que "el directorio que contiene el directoriofoo" estaría determinado porfoo/.., en cuyo caso no importaría si nos referimos afooofoo/.: el directorio que contiene sería el mismo.fooyfoo/.parece un poco delicada, pero no me importa, también me parece un poco divertido.Cuando corras
cp -R src/foo dest, lo conseguirásdest/foo. Entonces, si el directoriodest/foono existe,cplo creará y luego copiará el contenido desrc/fooadest/foo.Cuando ejecuta
cp -R src/. dest,cpve quedest/.existe, y luego es solo cuestión de copiar el contenido desrc/.adest/..Cuando se piensa en ello como copiar un directorio con el nombre
.desrcy la fusión de su contenido con el directorio existentedest/., tendrá sentido.fuente