¿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/.* B
desdeesta 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 A
el 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 usarfind
en lugar decp
como esto:
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
La sintaxis básica se divide así:
find A/ -type f
:find
elementos en el directorioA/
cuyo tipo es un archivo (en lugar de un directorio)…-maxdepth 1 -name '.*'
: A esto para unmaxdepth
de 1 directorios y cuyoname
comienza con.
.-exec cp -p {} B/ \;
: Y una vez que se encuentran estos archivos,exec
elcp
comando con una-p
bandera para preservar las fechas/horas desde el origen ({}
) hasta el destino deB/
.
Me gusta usarlo maxdepth
para 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