Como faço para mover arquivos de muitos diretórios filhos para meu diretório raiz?

0

Estou usando o bash no Mac 10.9.5. Eu tenho arquivos PDF em muitos diretórios, todos de um nível da raiz ...

Dir_1/abc.PDF
Dir_2/def.PDF
Dir_3/ghi.PDF
Dir_3/jkl.PDF
...

Como faço para escrever um comando shell para mover todos esses arquivos para o diretório "root", isto é, fazer com que os arquivos se alinhem ao lado dos diretórios filhos ...

abc.PDF
def.PDF
ghi.PDF
Dir_1
Dir_2
Dir_3

    
por Dave 20.03.2015 / 14:06

3 respostas

0

Que tal apenas:

mv ./*/*.pdf .

Eu fiz um teste no meu computador (zsh 5.0.7 (x86_64-pc-linux-gnu)) e funcionou perfeitamente:

> ls -r *    

sub3:
r.2  r.1

sub2:
s.2  s.1

sub1:
t.2  t.1

> mv ./*/*.pdf .
> ls
r.1  r.2  s.1  s.2  sub1  sub2  sub3  t.1  t.2


> tree                                                            
.
├── r.1
├── r.2
├── s.1
├── s.2
├── sub1
├── sub2
├── sub3
├── t.1
└── t.2
    
por 20.03.2015 / 14:28
0

Você pode usar find para isso:

find * -name "*.pdf" -maxdepth 1 -type f -exec mv {} ../ \;
  • -name "*.pdf" significa o padrão para corresponder
  • -maxdepth 1 significa que irá apenas um nível abaixo
  • -type f significa ignorar tudo o que não é um arquivo (inclui links simbólicos, diretórios, etc.)
  • -exec mv {} ../ \; é o comando a ser executado para cada arquivo encontrado - para ser específico, isso significa que o comando é mv <FILENAME> ../
por 20.03.2015 / 14:14
0
mv */*.PDF .

Isso expandirá para uma lista de todos os arquivos com extensão .PDF em todos os subdiretórios com um nível de profundidade e os moverá para o diretório atual.

Uma complicação pode surgir se houver tantas que você receba o erro argument list too long . Nesse caso, isso funcionará, supondo que não haja caracteres especiais, como espaços, ponto-e-vírgulas, citações, etc. nos nomes de diretório ou arquivo:

echo */*.PDF | xargs -i{} mv {} .

xargs é feito para tais situações: ele pega strings em sua entrada, coleta o máximo que puder em uma única execução e, em seguida, executa o comando fornecido com a lista coletada. Aqui dizemos xargs para substituir {} pela lista.

    
por 20.03.2015 / 14:13