Com as ferramentas GNU e rsync
, você pode fazer:
export LC_ALL=C # force tools to regard those file paths as arrays
# of bytes (as they are in effect) and not do fancy
# sorting (and use English for error/warning messages
# as an undesired side effect).
find . -type f -printf '%T@/%s/%pexport LC_ALL=C # force tools to regard those file paths as arrays
# of bytes (as they are in effect) and not do fancy
# sorting (and use English for error/warning messages
# as an undesired side effect).
find . -type f -printf '%T@/%s/%p%pre%' | # print mtime/size/path
sort -zn | # numerical sort, oldest first
awk -v RS='%pre%' -v ORS='%pre%' -F / -v max=50e12 '
{total_size += $2}
total_size > max {exit}
{
sub("^[^/]*/[^/]*/", "") # remove mtime/size/
print # path
}' |
rsync -nv -aHAX0 --files-from=- --remove-source-files . /dest/dir/
' | # print mtime/size/path
sort -zn | # numerical sort, oldest first
awk -v RS='%pre%' -v ORS='%pre%' -F / -v max=50e12 '
{total_size += $2}
total_size > max {exit}
{
sub("^[^/]*/[^/]*/", "") # remove mtime/size/
print # path
}' |
rsync -nv -aHAX0 --files-from=- --remove-source-files . /dest/dir/
(não testado. O -n
é para dry-run. Remova se estiver satisfeito).
Observe que estamos calculando o tamanho do arquivo cumulativo com base nos tamanhos dos arquivos ( %s
, substituindo por %b
para o uso do disco em setores (e alterando para total_size += $2 * 512
) e ignorando os links físicos. quando copiados para o sistema de arquivos de destino, juntamente com os diretórios que os contêm, provavelmente acabarão usando mais de 50 TB (a menos que haja compactação ou desduplicação no sistema de arquivos).