¿Cómo copiar archivos y subdirectorios ocultos (que comienzan con un punto) en Linux?

¿Cómo copiar archivos y subdirectorios ocultos (que comienzan con un punto) en Linux?

¿Cómo copiar archivos ocultos y subdirectorios ocultos (los que comienzan con un punto) de la carpeta A a la carpeta B? Por ejemplo si tengo esta estructura:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

Me gustaría copiar a B solo los archivos ocultos y los subdirectorios ocultos en A:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

Ya probé este comando: cp A/.* Bdesdeesta otra pregunta de superusuario. Sin embargo, no copia los subdirectorios. También lo intenté cp -r A/.* B, pero se copia, .así que termino con una copia exacta de A (incluidos los archivos normales). Se agradece cualquier ayuda.

Respuesta1

Siempre y cuando solo busques archivos y carpetas ocultos en el nivel A y no quieras, por ejemplo

A/b/.hidden

para ser copiado, deberías poder usar esto:

cp -r A/.[^.]* B

Básicamente significa copiar cualquier cosa que comience con a .y luego cualquier carácter que no sea a. .Eso filtra .y..

Editar: se eliminó el -p del comando cp ya que Asker no ha indicado que quiere conservar ninguna propiedad, fecha, etc.

Respuesta2

El problema A/.*es que existe el directorio .en Ael que también coincide con el patrón.

Puede activar patrones globales extendidos y utilizar lo siguiente:

shopt -s extglob
cp -r A/.!(?(.)) B    

Coincide con archivos cuyo nombre comienza con un punto y cuyo segundo carácter no es ni un punto ni nada ( ?(.) coincide con nada o un punto, !(...) lo niega, es decir, !(?(.)) coincide con todo lo demás que nada o un punto).

Respuesta3

Para casos como este recomendaría usarfinden lugar decpcomo esto:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

La sintaxis básica se divide así:

  • find A/ -type f: findelementos en el directorio A/cuyo tipo es un archivo (en lugar de un directorio)…
  • -maxdepth 1 -name '.*': A esto para un maxdepthde 1 directorios y cuyo namecomienza con ..
  • -exec cp -p {} B/ \;: Y una vez que se encuentran estos archivos, execel cpcomando con una -pbandera para preservar las fechas/horas desde el origen ( {}) hasta el destino de B/.

Me gusta usarlo maxdepthpara agregar una capa de control para no copiar accidentalmente un sistema de archivos completo. Pero siéntete libre de eliminarlo.

Respuesta4

Como alternativa puedes utilizar este otro comando si el segundo carácter es alfanumérico (fuente):

cp -r A/.[a-zA-Z0-9]* B

información relacionada