*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, mkshni 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/
zshTambién se corrigió esa otra falla del shell Bourne en que si el patrón no coincide, el mvcomando 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 bashno 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, bashno incluye .ni ..en globos como *, pero todavía lo hace para globos como .*.
Si establece la GLOBIGNOREvariable en algo que no esté vacío, entonces habilita automáticamente la dotglobopción y excluye .y ..de los .*globos pero no de dir/.*o .*/fileunos (!) 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 dotglobactivado) para ampliar dotfiles excepción .y ...
pez
fishlos 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 -- /destsi no hay ningún archivo.
ksh93
No hay calificador global en ksh93ninguno de los dos. Puede incluir archivos de puntos en globos con:
FIGNORE='@(.|..)'
Al contrario de bashs' GLOBIGNORE, que se ha hecho correctamente y también corrige el problema de .*que incluye .y ...
yash
yashtiene una dot-globopció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 ..).