*
es un globo que se expande por el caparazón. De manera predeterminada, los shells no incluyen archivos cuyo nombre comience con un .
(llamados archivos ocultos o archivos de puntos) a menos que el encabezado .
se ingrese literalmente.
*
o [.]*
o ?*
o *.*
o dir/*
no incluirán archivos de puntos.
.*
o lo dir/.*
haré.
Entonces podrías hacer:
mv -- * .* /dest/
sin embargo, algunos shells que incluyen bash
(pero no zsh
, mksh
ni fish
) tienen la característica errónea de que la expansión de .*
incluir las entradas de directorio especiales .
y ..
, que no desea aquí (y generalmente nunca quiere que se incluya un globo, es por eso que lo llamo una característica incorrecta).
Por esa razón, encontrará que a veces las personas usan (en conchas tipo Bourne):
mv -- * .[!.]* ..?* /dest/
Esos son tres globos, el primero coincide con archivos no ocultos, el segundo nombre de archivo comienza con .
seguido de un carácter diferente .
y el tercero nombres de archivo comienzan con ..
seguido de al menos un carácter.
Sin embargo, algunos proyectiles modernos tienen mejores formas de evitar eso
zsh
Con zsh
, puede usar el (D)
calificador glob para especificar que el glob debe incluir archivos de puntos:
mv -- *(D) /dest/
zsh
También se corrigió esa otra falla del shell Bourne en que si el patrón no coincide, el mv
comando no se ejecuta.
Como se dijo anteriormente, nunca incluirá .
ni ..
en sus globos, por lo que
mv -- * .* /dest/
será segura. Sin embargo, si no hay coincidencia de archivos *
o no coincide .*
el archivo, el comando se cancelará, por lo que sería mejor usar:
mv -- (*|.*) /dest/
Al igual que en otros shells, también puede obligar a todos los globos a incluir archivos de puntos (por ejemplo, si desea que los archivos de puntos se incluyan con mayor frecuencia) con:
setopt dotglob
o:
set -o dotglob
Después de eso, si desea que un globo en particular no incluya archivos de puntos, puede escribirlo:
echo *(^D)
O:
echo [^.]*
Golpetazo
Lamentablemente bash
no tiene calificadores globales. Por lo tanto, le queda habilitar la inclusión de archivos de puntos a nivel mundial. En bash
, la sintaxis es:
shopt -s dotglob
(y usar [^.]*
para globos sin archivos ocultos).
Con dotglob
, bash
no incluye .
ni ..
en globos como *
, pero todavía lo hace para globos como .*
.
Si establece la GLOBIGNORE
variable en algo que no esté vacío, entonces habilita automáticamente la dotglob
opción y excluye .
y ..
de los .*
globos pero no de dir/.*
o .*/file
unos (!) Para que la protección sea bastante inútil. Podrías hacerlo, GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'
pero luego rompería globos como */.
o ./*
o ../*
.
Una mejor en torno al trabajo es utilizar [.]*
o dir/[.]*
o [.]*/file
(con dotglob
activado) para ampliar dotfiles excepción .
y ..
.
pez
fish
los globos no incluyen .
ni ..
. Cuando no hay coincidencia, dependiendo de la versión, funcionará como zsh
(o bash -o failglob
) o bash -o nullglob
.
mv -- * .* /dest/
Funcionaría si hay archivos ocultos y no ocultos. De lo contrario, YMMV y con algunas versiones, puede llamar mv -- /dest
si no hay ningún archivo.
ksh93
No hay calificador global en ksh93
ninguno de los dos. Puede incluir archivos de puntos en globos con:
FIGNORE='@(.|..)'
Al contrario de bash
s' GLOBIGNORE
, que se ha hecho correctamente y también corrige el problema de .*
que incluye .
y ..
.
yash
yash
tiene una dot-glob
opción ( set -o dot-glob
), pero al contrario bash
, las expansiones globales (incluso de *
) incluyen .
y, ..
por lo tanto, es bastante inútil.
tcsh
set globdot
Funciona como en bash
, es decir, *
incluye archivos de puntos excepto .
y ..
pero .*
aún incluye .
y ..
(y puede usar [.]*
para expandir archivos ocultos excepto .
y ..
).