No Bash (e alguns outros), você pode usar a expansão de chaves para fazer isso em uma linha:
mv bar/{,.}* .
A vírgula separa um nulo e um ponto, portanto, o comando mv
vê nomes de arquivos que correspondem a *
e .*
Esta é uma questão um pouco embaraçosa, mas tenho que admitir que no final da minha carreira ainda tenho dúvidas sobre o comando mv.
Freqüentemente tenho esse problema: Preciso mover todos os arquivos recursivamente para um nível acima. Digamos que eu tenha pasta foo e uma barra de pastas dentro dela. Bar tem uma confusão de arquivos e pastas, incluindo arquivos de ponto e pastas. Como faço para mover tudo em barra para o nível foo?
Se foo estiver vazio, eu simplesmente movo bar um nível acima, delete foo e renomeio bar em foo. Parte do problema é que não consigo descobrir qual é o caractere curinga do mv para "tudo, incluindo os pontos". Uma parte desta questão é esta - existe uma discussão aprofundada dos curingas que os comandos cp e mv usam em algum lugar (googling isso só traz tutoriais muito básicos).
No Bash (e alguns outros), você pode usar a expansão de chaves para fazer isso em uma linha:
mv bar/{,.}* .
A vírgula separa um nulo e um ponto, portanto, o comando mv
vê nomes de arquivos que correspondem a *
e .*
A maneira mais fácil de fazer isso é fazê-lo em dois comandos, porque * não corresponde a .whatever
cd /foo
mv bar/* ./
mv bar/.??* ./
Você não quer usar a barra /.* que descobri ao cometer este erro:
rm -rf ./.*
Esta é uma coisa ruim. Alguém quer adivinhar por quê? ;-)
A primeira coisa a saber sobre globbing - é feito pelo shell, não pelo comando. Verifique a página do manual do seu shell para todos os detalhes.
Este coleciona todos os arquivos das subpastas e os move para o diretório atual
find . -type f -exec mv -iv \{} . \;
Se você quiser owerwrite arquivos com o mesmo nome, use
yes y | find . -type f -exec mv -iv \{} . \;
mv .??* *
cuidará de qualquer coisa, exceto ponto seguido por um único caractere. Se isso é comum para sua situação, você pode adicionar .[a-zA-Z0-9]*
. Isso ainda deixará arquivos com nomes como .;
, .^
e .^I
(guia). Se você precisa lidar com tudo, precisará ser um pouco mais complexo.
mv .. 'ls -f | egrep -v '^.$|^..$'
Se você tiver uma estrutura de diretório /foo/bar/
e quiser mover todos os arquivos em bar
um passo acima, vá até o diretório bar
e digite o seguinte:
find . -depth -print0 | cpio --null -pvd ../
Geralmente, acho que cpio(1)
é melhor para esse tipo de tarefa. Você pode verificar a documentação detalhada emitindo info cpio
em seu shell.