La razón es porque en bash
, *
no incluye archivos que comienzan con un punto (.
).
Puedes correr
cp A/.* B
Te avisará que no copió .
o ..
, o cualquier subdirectorio, pero esto está bien.
O, si desea copiar archivos de puntos y archivos normales juntos, ejecute
cp A/.* A/* B
También puedes ejecutar
shopt -s dotglob
cp A/* B
que funcionará en bash
, pero no sh
.
Y si no le importa que también se copien los subdirectorios, este es el más fácil:
cp -R A/ B
Sugerencia:si alguna vez los comodines no están haciendo lo que espera, intente ejecutarlo con eco, por ejemplo,
$ echo A/*
A/file1 A/file2
$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2
$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2
$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2
Si bash, puede configurar dotglob
antes de copiar
shopt -s dotglob
cp A/* /destination
O un lenguaje de programación
$ ruby -rfileutils -e 'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'
Si no desea configurar dotglob, simplemente
cp A/.* /destination 2>/dev/null
Lo que estás buscando es más parecido a:
cp A/.??* B/
Esto coincidirá con todos los archivos de puntos, pero no con "." o "..". La mayoría de las soluciones anteriores están bien siempre que no trabaje de forma recursiva. Pero tan pronto como quieras hacer algo como:
cp -R A/.??* B/
Sin omitir "..", copiará todo desde el directorio principal hacia abajo, incluidos los archivos que no sean puntos.