Respuestas:
Descargo de responsabilidad: ¡Esta respuesta trata específicamente de Bash, pero gran parte se aplica a la pregunta sobre los patrones globales!
El personaje estrella ( *
) es un comodín. Hay un cierto conjunto de caracteres que tomará el lugar y el primer carácter que es un punto ( .
) no es uno de ellos. Este es un caso especial solo por cómo funcionan los sistemas de archivos Unix, los archivos que comienzan con un punto se consideran "ocultos". Eso significa que las herramientas tales como cp
, ls
, etc., no va a "ver" a menos que explícitamente se diga que lo haga.
Primero creemos algunos datos de muestra.
$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}
Entonces ahora tenemos lo siguiente:
$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3
Ahora juguemos algunos juegos. Puede usar el comando echo
para enumerar qué sería un comodín particular ( *
) para un comando dado de la siguiente manera:
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo reg*
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2
$ echo .* *
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .dotdir*
.dotdir1 .dotdir2
Puede usar el comando shopt -s dotglob
para cambiar el comportamiento del *
archivo de modo que, además de archivos como regfile1
este, también coincidan .dotfile1
.
extracto de la bash
página del manual
dotglob If set, bash includes filenames beginning with a `.' in the results
of pathname expansion.
Ejemplo:
$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
Puede revertir este comportamiento con este comando:
$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
Para ti, estás diciendo cp
que quieres copiar todos los archivos que coinciden con el patrón *
, y no hay ningún archivo.
$ cp foo/.* .
O puede hacer esto si quiere todo en la foo
carpeta:
$ cp foo .
O puedes ser explícito:
$ cp foot/.* foo/* .
Una forma más compacta con expansión de llaves en bash
:
$ cp foo/{.,}* .
En cualquier momento puede usar el echo
truco para ver cuáles son los patrones de archivo propuestos (ese es el término elegante para saber de qué forma parte la estrella).
$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3
Por cierto, si va a copiar un directorio de archivos + otros directorios, normalmente desea hacer esto de forma recursiva, ese es el -R
cambio a cp
:
$ cp -R foo/. .
shopt -s dotglob
, echo *
luego da:.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
cp -r foo .
Por lo general, no funcionará, ya que cp
se negará a copiarse foo
sobre sí mismo cp -R foo/. .
. (tenga en cuenta que cp -R
es el estándar).
zsh
no incluye .
y ..
en la expansión de .*
. En zsh
, si un patrón no coincide, el comando se cancela (de manera bastante sensata), por lo que, en el caso general, cp foo/{,.}* .
fallará si no hay archivos ocultos o no ocultos.
shopt
no existe.
Con zsh
, la forma típica es usar el D
calificador glob (para incluir [D] ot archivos):
cp foo/*(D) .
Tenga en cuenta que con o sin D
, los globos zsh nunca incluyen .
ni ..
(como era de esperar).
El shell trata esos archivos como ocultos cuando resuelve el *
carácter, por lo cp
que no recibe ninguno de estos nombres de archivo como argumentos.
Puede copiarlos especificando explícitamente cp foo/.* .
Si lo que quiere hacer es copiar todos los archivos y directorios de un lugar a otro, puede usar el rsync
comando estándar . En el ejemplo que das arriba:
mkdir foo && touch foo/.test
rsync -a foo/ .
copiará recursivamente todo el contenido de foo
, incluidos los archivos ocultos y los directorios ocultos, en el directorio actual. La barra diagonal final al final de foo/
es importante para rsync; con él solo foo
se copia el contenido de , sin rsync también se copiará foo
. Por ejemplo:-
mkdir src && mkdir dest && touch src/.test
rsync -a src dest // copies 'src' contents to 'dest/src'
rsync -a src/ dest // copies 'src' contents to 'dest'
Hay muchas otras opciones disponibles para ajustar rsync, incluida la copia entre máquinas.
dotglob
es traducidoglobdots
por zsh, que es un nombre de opción no válido para bash .