Qual é a maneira mais eficiente de mover um grande número de arquivos que residem em um único diretório?

7

CentOS 5.x

Peço desculpas se esta é uma pergunta repetida. Eu vi muitas perguntas semelhantes (sobre a exclusão de arquivos), mas não exatamente o mesmo cenário.

Eu tenho um diretório contendo centenas de milhares de arquivos (possivelmente mais de um milhão) e, como uma correção de curto prazo para um problema diferente, preciso mover esses arquivos para outro local.

Para fins de discussão, digamos que esses arquivos residem originalmente em /home/foo/bulk/ e eu quero movê-los para /home/foo2/bulk2/

Se eu tentar mv /home/foo/bulk/* /home/foo2/bulk2/ , recebo um erro "muitos argumentos".

Sr. O Google me diz que uma alternativa para excluir arquivos em massa seria executar o find. Algo como: find . -name "*.pdf" -maxdepth 1 -print0 | xargs -0 rm

Isso seria bom se eu estivesse apagando coisas, mas neste caso eu quero mover os arquivos ... Se eu digitar algo como find . -name "*" -maxdepth 1 -print0 | xargs -0 mv /home/foo2/bulk2/ bash reclama sobre o arquivo não ser um diretório.

Qual é o melhor comando para usar aqui para mover os arquivos em massa de um diretório para outro?

    
por Mike B 28.11.2013 / 00:35

5 respostas

13

Aproveitando a opção mv do GNU -t para especificar o diretório de destino, em vez de confiar no último argumento:

find . -name "*" -maxdepth 1 -exec mv -t /home/foo2/bulk2 {} +

Se você estivesse em um sistema sem a opção, você poderia usar um shell intermediário para obter os argumentos na ordem correta ( find … -exec … + não suporta colocar argumentos extras após a lista de arquivos).

find . -name "*" -maxdepth 1 -exec sh -c 'mv "$@" "$0"' /home/foo2/bulk2 {} +
    
por 28.11.2013 / 01:09
5

Considere mv ing o diretório pai em vez dos arquivos:

mv /home/foo/bulk /home/foo2/bulk2 && mkdir /home/foo/bulk

(Mas isso pode causar problemas se /home/foo/bulk precisar existir a cada momento).

    
por 28.11.2013 / 01:53
0

Apenas por variedade, gosto de usar o cpio em alguns casos como esse.

find tmp |cpio -v  -p --make-directories --sparse tmp2
    
por 28.11.2013 / 02:06
0

Com o GNU mv :

find . -mindepth 1 -exec mv -t /tmp {} +

Em sistemas como o OS X que não têm mv -t , mas têm -print0 e xargs -0 :

find . -mindepth 1 -print0|xargs -0 -I, mv , /tmp

Ou se os nomes dos arquivos não contiverem espaços, aspas, barras invertidas ou novas linhas (com xargs do OS X) ou aspas, barras invertidas ou novas linhas (com GNU xargs ):

ls|xargs -I, mv , /tmp
    
por 29.05.2014 / 17:49
-3

Por um tempo especificado, tente o seguinte:

find . -name "*" -type f -mtime +7 -exec mv -t /folder/to/transfer/files {} +
    
por 30.08.2016 / 12:56