O comando que você está procurando é
mv * .[^.]* ..
ou (veja abaixo para mais informações):
(shopt -s dotglob; mv -- * ..)
Explicação: o comando mv
move arquivos e diretórios. O último argumento para mv
é o destino (neste caso, o diretório um passo "para cima" na árvore, ..
). Os argumentos anteriores são os arquivos e diretórios de origem. O asterisco ( *
) é um caractere curinga que corresponde a todos os arquivos que não iniciam com um ponto. Arquivos que começam com um ponto (dotfiles) estão "ocultos". Eles são correspondidos usando o padrão .[^.]*
(veja a edição abaixo).
Veja a página de manual que eu vinculei para mais informações sobre mv
.
Por que .[^.]*
em vez de .*
?
Como Chris Johnsen aponta corretamente: o padrão .*
também corresponde a .
e ..
. Como você não quer (e não pode) movê-los, é melhor usar um padrão que corresponda a qualquer nome de arquivo começando com um ponto exceto aqueles dois . O padrão .[^.]*
faz exatamente isso: ele combina qualquer nome de arquivo (1) começando com um ponto (2) seguido por um caractere que é não um ponto (3) seguido por zero ou mais caracteres arbitrários.
Como Paggas aponta , nós também teríamos que adicionar o padrão .??*
para combinar arquivos começando com dois pontos. Veja a resposta dele para uma solução alternativa usando find
.
Arjan's answer menciona shopt
para evitar todos esses problemas com dotfiles. Mas ainda há o problema com os arquivos que começam com um traço. E isso requer três comandos. Ainda assim, gosto da ideia. Eu proponho usá-lo assim:
(shopt -s dotglob; mv -- * ..)
Isso executa shopt
em uma subshell (portanto, não é necessária uma segunda chamada para shopt
) e usa --
para que os arquivos iniciados com um traço não sejam interpretados como argumentos para mv
.