El comando que está buscando es
mv * .[^.]* ..
o (ver abajo para más información):
(shopt -s dotglob; mv -- * ..)
Explicación:el mv
El comando mueve archivos y directorios. El último argumento de mv
es el destino (en este caso, el directorio un paso "arriba" en el árbol, ..
). Los argumentos anteriores son los archivos y directorios fuente. El asterisco (*
) es un comodín que coincide con todos los archivos que no comienzan con un punto. Los archivos que comienzan con un punto (dotfiles) están "ocultos". Se combinan usando el patrón .[^.]*
(ver edición a continuación).
Consulte la página de manual que vinculé para obtener más información sobre mv
.
Por qué .[^.]*
en lugar de .*
?
Como señala correctamente Chris Johnsen:el patrón .*
también coincide con .
y ..
. Dado que no desea (y no puede) moverlos, es mejor usar un patrón que coincida con cualquier nombre de archivo que comience con un punto excepto esos dos . El patrón .[^.]*
hace precisamente eso:coincide con cualquier nombre de archivo (1) que comience con un punto (2) seguido de un carácter que no un punto (3) seguido de cero o más caracteres arbitrarios.
Como señala Paggas, también tendríamos que agregar el patrón .??*
para hacer coincidir los archivos que comienzan con dos puntos. Vea su respuesta para una solución alternativa usando find
.
La respuesta de Arjan menciona shopt
para evitar todos esos problemas con dotfiles. Pero aún existe el problema con los archivos que comienzan con un guión. Y requiere tres comandos. Aún así, me gusta la idea. Propongo usarlo así:
(shopt -s dotglob; mv -- * ..)
Esto ejecuta shopt
en una subcapa (por lo tanto, no hay una segunda llamada a shopt
requerido) y usa --
para que los archivos que comiencen con un guión no se interpreten como argumentos para mv
.
Respuesta corta:usar
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Respuesta larga:
El comando
mv * .* ..
no funcionará desde .*
puede coincidir con .
y ..
. Pero el comando
mv * .[^.]* ..
tampoco funcionará, ya que .[^.]*
no coincidirá, por ejemplo, ..filename
! En cambio, lo que hago es
mv * .[^.] .??* ..
que coincidirá con todo excepto .
y ..
. *
coincidirá con todo lo que no comience con un .
, .[^.]
coincidirá con todos los nombres de archivo de 2 caracteres que comiencen con un punto excepto ..
y .??*
coincidirá con todos los nombres de archivo que comiencen con un punto con al menos 3 caracteres.
Mejor aún, puedes usar
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
que evita los feos trucos de glob en mv * .[^.] .??* ..
!
Solo por el bien de la exhaustividad, también se puede indicar al shell de Bash que incluya archivos ocultos, usando shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob