Estou procurando um comando / script para permitir que os arquivos modificados mais recentemente (até) 10 GB sejam copiados para outro computador.
Portanto, se houver 4 arquivos de 4 GB cada, apenas 2 deles deverão ser transferidos pelo script. Se houver 12 arquivos de 1 GB de tamanho, apenas os 10 mais recentes deverão ser transferidos.
scripting
rsync
cp
synchronization
exussum
fonte
fonte
Respostas:
Aqui está um script que faz exatamente o que você pediu.
Os requisitos
Os detalhes
Ele é usado
rsync --dry-run
para criar uma lista de arquivos que seriam transferidos (esses são os arquivos modificados). Em seguida, ele usa uma combinação dedu
els
para obter tamanhos de arquivo e mtime. Em seguida, ele classifica os arquivos por mtime e os faz um loop até que o tamanho total exceda um limite. Por fim, chama o rsync novamente apenas com os arquivos modificados mais recentemente e com tamanho total abaixo do limite.O script é um pouco feio, mas funciona. Uma grande limitação é que ele deve ser executado na máquina que contém o diretório rsync from. Ele pode ser modificado para usar ssh para usar um diretório remoto, mas esse tamanho excedente é deixado para o leitor.
Finalmente, as
rsync
opções são codificadas no script, mas essa é uma alteração fácil se você quiser especificá-las na linha de comando. Além disso, a matemática para calcular o tamanho é feita em bytes. Isso pode ser alterado para quilo / mega / gigabytes, modificando a chamada para du e reduzindo o limite pelo mesmo fator.Uso
onde
rsync-from-directory
é um diretório local ersync-to-directory
qualquer diretório local ou remoto. As opções padrão são codificadas como-avz
e o limite padrão é codificado como10GiB
.O script
fonte
if (( "$size" > "$THRESHOLD" ))
condicional, adicione uma verificação (antesbreak
) parai==0
e, se forecho $f >> /tmp/rsyncfilelist
,.Eu usaria o rsync "--dry-run" (ou "-n") para obter a lista dos arquivos mais recentes. Então eu usaria outro rsync com a opção "--files-from = -" para enviar os arquivos. Entre há perl "feio" .
Algo assim :
Note que eu não testei com mais de 10 GB, talvez o perl transborde em algum limite; para resolver isso, em vez de contar bytes, use Kbytes:
Edição: observei que esta primeira solução não classificaria o arquivo por mtime , aqui está uma solução mais completa (semelhante ao script bash que foi postado por outra pessoa).
fonte
Você pode analisar a saída classificada de
du
. Assumindo utilitários GNU:POSIXly, supondo que nenhum nome de arquivo contenha um caractere de nova linha:
Observe que
du
atravessa subdiretórios. Para evitar isso, diga emdu
quais arquivos você deseja operar. Em geral, você pode usarfind
para filtrar arquivos.fonte
rsync
vez decp
.