Copie os arquivos e a árvore de diretórios para o tamanho do arquivo no intervalo especificado

2

Oi eu gostaria de fazer um pequeno script copiando arquivos de diferentes diretórios exemplo /pp/01 /pp/02/ etc ... para outro destino com o mesmo design de diretório. Mas apenas esses arquivos dentro do diretório com um tamanho maior que 88MB mas menor que 93MB ...

Eu usaria um loop for e a função find. Existem maneiras mais eficientes? E como posso implementar a função find exatamente? Alguém poderia me ajudar com isso? Eu sou novo no Unix.

    
por user70606 05.06.2014 / 12:37

4 respostas

4

Acho que é isso que você está procurando:

$ find /file/location/ -type f -size +88M -size -93M \
    -exec cp {} /new/location/ \;'

Este comando encontrará apenas arquivos maiores que 88MB e menores que 93MB. Em seguida, copiará cada um dos arquivos para /new/location .

Quando se trata de manter a estrutura de diretórios, fica um pouco mais difícil. Eu resolveria esse problema assim:

$ cd /pp
$ find . -type f -size +88M -size -93M -exec cp \
    --parents {} /new/location/pp \;

Isso fará com que find retornem caminhos de arquivos parecidos com 01/myfile , 02/myfile , etc. O sinalizador pai em cp faz anexar uma barra + o nome especificado do arquivo de origem.

Exemplo: find encontra um arquivo que corresponde e gera "02 / myfile". cp move este arquivo para /new/location/pp/02/myfile , criando todos os diretórios necessários.

    
por 05.06.2014 / 12:52
4

Este comando:

rsync -a --min-size 88m --max-size 93m pp /new_destination/

copia a estrutura de pp para /new_destination , mas apenas arquivos com pelo menos 88 MB e no máximo 93 MB.

Adicione mais árvores de diretórios de origem antes do especificador de destino final, se desejar, como:

rsync -a --min-size 88m --max-size 93m pp/01 pp/02 /target/

Se você adicionar uma barra à especificação de origem ( pp/ em oposição a pp ), rsync não criará esse diretório no destino.

Em outras palavras: pp no meu primeiro exemplo, resulta em /new_destination/pp/01/... , enquanto isso:

rsync -a --min-size 88m --max-size 93m pp/ /new_destination/
Em vez disso,

resulta em /new_destination/01/... , /new_destination/02/... .

A -a flag para rsync significa "archive", que recursa em diretórios, preserva metadados nos arquivos, como permissões e registros de data e hora. (É uma opção de conveniência que é igual a -rlptgoD , que é uma combinação muito popular de opções).

    
por 05.06.2014 / 15:56
3

Supondo que os nomes de arquivos e diretórios não contenham caracteres de nova linha, POSIXly:

cd /path/to/src/ &&
  find . -type f -size -"$((93 * 1024 * 1024))c" \
                 -size +"$((88 * 1024 * 1024))c" |
    pax -rw /path/to/dst/
    
por 05.06.2014 / 13:49
1

Para copiar arquivos com tamanho em um intervalo de "mínimo" a "máximo" e recriar a estrutura de diretórios, use algo como isto

MINSIZE=3k  
MAXSIZE=10k  
cd /source/dir && \
   find . -type f -size "+$MINSIZE" -size "-$MAXSIZE" | cpio -pvdm /target/path

cpio opções

  • -p "Pass-though" mode, cada arquivo listado é copiado para o diretório especificado
  • -v "Verbose", pode ser omitido, ou para fazer um ponto para cada arquivo apenas para ter uma pista visual sobre o progresso, use -V no lugar.
  • -d "Crie diretórios conforme necessário"
  • -m "Preserve o modo" (permissões, propriedade)
por 05.06.2014 / 15:08