Como recursivamente mover todos os arquivos (incluindo oculto) em uma subpasta para uma pasta pai em * nix?

14

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).

    
por deadprogrammer 13.03.2010 / 20:26

6 respostas

19

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 .*

    
por 14.03.2010 / 15:17
2

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ê? ;-)

    
por 13.03.2010 / 20:34
2

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.

    
por 13.03.2010 / 21:09
2

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 \{} . \;
    
por 23.03.2012 / 22:42
1

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 '^.$|^..$'
    
por 14.03.2010 / 20:19
0

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.

    
por 15.03.2010 / 11:01