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