Qual é o caminho mais rápido para mover um milhão de imagens de um diretório para outro?

9

Eu tenho um milhão de imagens com 30gb de espaço em disco que precisam ser movidas de um diretório local para outro diretório local.

Qual será o caminho mais eficiente? mv cp? rsync? Algo mais? Dicas?

/path/to/old-img-dir/*
                     00000000.jpg
                     --------.jpg  ## nearly 1M of them! ##
                     ZZZZZZZZ.jpg

Mova-os para cá:

/path/to/new/img/dir/
    
por Ryan 16.10.2012 / 08:54

7 respostas

21

rsync seria uma escolha ruim, pois faz muito trabalho em segundo plano cliente / servidor, o que explica sistemas locais e remotos.

mv é provavelmente a melhor escolha. Se possível, você deve tentar mv directory_old directory_new em vez de mv directory_old/* directory_new/ . Dessa forma, você move uma coisa em vez de um milhão de coisas.

    
por 16.10.2012 / 09:06
12
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • Isso não sobrecarregará a expansão de argumentos.
  • Você pode especificar a extensão do arquivo, se quiser. (-name ...)
  • find -print0 com xargs -0 permite que você use espaços nos nomes.
  • xargs -r não executará mv a menos que haja algo a ser movido. ( mv irá reclamar se nenhum arquivo de origem for fornecido).
  • A sintaxe mv -t permite especificar primeiro o destino e depois os arquivos de origem, necessários para xargs .
  • Mover o diretório inteiro é, claro, muito mais rápido, já que ocorre em tempo constante, independentemente do número de arquivos contidos nele, mas:
    • o diretório de origem desaparecerá por uma fração de tempo e poderá criar problemas para você;
    • se o processo estiver usando o diretório atual como diretório de saída (ao contrário de sempre se referir a um caminho completo a partir de um local sem movimentação), será necessário reiniciá-lo. (como você faz com log rotation ).

A propósito, eu me pergunto se eu realmente tenho que mover uma quantidade tão grande de arquivos de uma só vez. O processamento em lote é superestimado. Eu tento não acumular grandes quantidades de trabalho se eu puder processar as coisas no momento em que elas são geradas.

    
por 16.10.2012 / 12:48
4

Se os dois diretórios residirem no mesmo sistema de arquivos, use mv no DIRETÓRIO e não o conteúdo do diretório.

Se eles residirem em dois sistemas de arquivos diferentes, use o rsync:

rsync -av /source/directory/ /destination

Observe o trailing / na origem. Isso significa que copiará o conteúdo do diretório e não o próprio diretório. Se você deixar o / off, ele ainda copiará os arquivos, mas eles ficarão em um diretório chamado /destination/directory . Com o /, os arquivos estarão apenas em /destination

rsync manterá a propriedade do arquivo se você executá-lo como root ou se os arquivos pertencerem a você. Ele também manterá o mtime de cada arquivo individual.

    
por 16.10.2012 / 16:07
1

Como directory_old e directory_new estão no mesmo sistema de arquivos, você pode usar cp -l em vez de mv como opção. cp -l criará links físicos para os arquivos originais. Quando você terminar com 'move' e estiver satisfeito com o resultado, poderá remover esses arquivos de directory_old. em termos de velocidade, será o mesmo que 'mv' quando você criar os links e depois remover os originais. Mas essa abordagem permite que você comece do começo se isso fizer sentido

    
por 16.10.2012 / 14:24
0

Depende (tm). Se o seu sistema de arquivos é copy-on-write, então copiar ( cp ou rsync , por exemplo) deve ser comparável a um movimento. Mas para os casos mais comuns, o movimento ( mv ) será o mais rápido, pois pode simplesmente alternar os dados que descrevem onde um arquivo é colocado (nota: isso é excessivamente simplificado).

Então, na sua instalação média do Linux, eu usaria mv .

EDITAR: @ Frédéric Hamidi tem um bom ponto nos comentários: Isto só é válido se ambos estiverem no mesmo sistema de arquivos e disco. Caso contrário, os dados serão copiados de qualquer maneira.

    
por 16.10.2012 / 09:00
0

Para copiar pelo menos ~ 10k de arquivos (sem diretórios), o cp reclamou com:

unable to execute /bin/cp: Argument list too long

A melhor opção é o Rsync:

rsync source target

E foi feito muito rapidamente!

    
por 29.08.2018 / 15:24
-1
tar cf - dir1 | (cd dir2; tar xf -)

tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )"

Quando você usa 'cp', cada arquivo faz um open-read-close-open-write-close. Tar usa diferentes processos de leitura e escrita, bem como vários passos para operar em vários arquivos de uma só vez. Mesmo em uma única caixa de CPU, os aplicativos multithread são mais rápidos.

    
por 16.04.2016 / 19:21