Eu tenho um diretório grande contendo subdiretórios e arquivos que desejo copiar recursivamente.
Existe alguma maneira de dizer cp
que ele deve executar a operação de cópia na ordem do tamanho do arquivo, para que os arquivos menores sejam copiados primeiro?
Respostas:
Isso faz todo o trabalho de uma só vez - em todos os diretórios filhos, tudo em um único fluxo, sem problemas de nome de arquivo. Ele copiará do menor para o maior todos os arquivos que você tiver. Você precisará
mkdir ${DESTINATION}
se ele ainda não existir.Você sabe o que? O que isso não faz é diretórios filhos vazios . Eu poderia fazer algum redirecionamento sobre esse pipeline, mas é apenas uma condição de corrida esperando para acontecer. O mais simples é provavelmente o melhor. Então faça isso depois:
Ou, como Gilles faz um argumento muito bom em sua resposta para preservar as permissões de diretório, devo tentar também. Eu acho que isso fará isso:
Eu estaria disposto a apostar que é mais rápido do que
mkdir
nunca.fonte
Aqui está um método rápido e sujo usando
rsync
. Neste exemplo, estou considerando que qualquer coisa com menos de 10 MB seja "pequena".Primeiro transfira apenas os arquivos pequenos:
rsync -a --max-size=10m srcdir dstdir
Depois transfira os arquivos restantes. Os arquivos pequenos transferidos anteriormente não serão copiados, a menos que tenham sido modificados.
rsync -a srcdir dstdir
A partir de
man 1 rsync
Obviamente, a ordem de transferência arquivo a arquivo não é estritamente do menor para o maior, mas acho que pode ser a solução mais simples que atende ao espírito de seus requisitos.
fonte
--copy-dest=DIR
e / ou--compare-dest=DIR
eu acho. Só sei porque tive que--hard-dereference
me adicionartar
depois de postar minha própria resposta porque estava faltando os links. Eu acho quersync
realmente se comporta de maneira mais específica aos sistemas de arquivos locais com os outros - eu costumava usá-lo com chaves USB e inundava o barramento, a menos que eu definisse um limite de largura de banda. Acho que deveria ter usado um desses outros.Não
cp
diretamente, isso está muito além de suas habilidades. Mas você pode organizarcp
os arquivos na ordem certa.O Zsh convenientemente permite classificar arquivos por tamanho com um qualificador glob . Aqui está um trecho de código zsh que copia arquivos em ordem crescente de tamanho, de baixo
/path/to/source-directory
para baixo/path/to/destination-directory
.Em vez de um loop, você pode usar a
zcp
função No entanto, você precisa primeiro criar os diretórios de destino, o que pode ser feito em um oneliner críptico.Isso não preserva a propriedade dos diretórios de origem. Se você quiser isso, precisará inscrever um programa de cópia adequado, como
cpio
oupax
. Se você fizer isso, não precisará telefonarcp
ouzcp
além disso.fonte
Eu não acho que exista alguma maneira
cp -r
de fazer isso diretamente. Como pode ser um período indeterminado antes de você obter uma soluçãofind
/ assistenteawk
, aqui está um rápido script perl:Usa isto:
./whatever.pl /src/path /dest/path
Os argumentos devem ser ambos caminhos absolutos ;
~
, ou qualquer outra coisa que o shell expanda para um caminho absoluto é bom.Se você adicionar um terceiro argumento (qualquer coisa, exceto um literal
0
), em vez de copiar, ele imprimirá para padronizar um relatório do que faria, com tamanhos de arquivos em bytes anexados, por exemploObserve que eles estão em ordem crescente por tamanho.
O
cp
comando na linha 34 é um comando literal do shell, para que você possa fazer o que quiser com os comutadores (usei apenas-a
para preservar todas as características).File::Find
eFile::Basename
são os dois módulos principais, ou seja, estão disponíveis em todas as instalações do perl.fonte
cp - copy smallest files first?
mas o título da postagem écopy smallest files first?
De qualquer forma, as opções nunca ferem é a minha filosofia, mas você e David são os únicos que usaramcp
e você é o único que conseguiu.cp
foi porque é a maneira mais simples de preservar as características do arquivo * nix no perl (orientado a várias plataformas). O motivo que a barra do navegadorcp -
indica é por causa de um recurso SE (IMO, pateta), pelo qual a mais popular das tags selecionadas aparece como prefixo do título real.pearl
saindo da madeira por aqui.outra opção seria usar cp com a saída de du:
Isso ainda pode ser feito em uma linha, mas eu divido para que você possa ler
fonte