Encontre os arquivos / diretórios mais antigos no sistema de arquivos até 50 TB

8

Eu preciso encontrar os arquivos mais antigos com seus diretórios associados em um sistema de arquivos de 90 TB até 50 TB e, em seguida, movê-los para outro sistema de arquivos. Eles precisam manter sua estrutura de diretórios, pois é isso que identifica quais são os arquivos. Então -

primeiro nível / segundo nível / terceiro nível / (arquivo)

é a estrutura. Eu preciso mover toda a estrutura - não há nada nos diretórios de nível superior, mas sem eles eu não consigo identificar a que arquivo pertence, pois todos os arquivos que estou procurando têm o mesmo nome. Quando o processo estiver concluído, eu devo ter cerca de 40 TB no sistema de arquivos original e quase nada no novo sistema de arquivos deixou como os arquivos mais antigos no original estão lá.

Obrigado!

    
por J Telep 13.03.2017 / 14:39

2 respostas

9

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/%p
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/%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).

    
por 13.03.2017 / 14:53
2

O comando 'ls' é um pouco criativo com timestamps - então analisá-los pode ser uma dor. Provavelmente seria muito mais fácil implementar isso em uma linguagem que implementasse stat () . Algumas versões do Unix têm um status da linha de comando - em uma caixa RH próxima:

 find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less

Mas isso funcionará como um cachorro com um grande número de arquivos.

A documentação para o GNU awk inclui uma extensão de exemplo fornecendo funções do sistema de arquivos, mas você precisaria fazer algum trabalho para construir e manter isso.

Escrever um programa do zero em PHP, C ou Perl (ou ir, ruby ou muitos outros idiomas) seria simples, mas além do escopo de um post aqui.

    
por 13.03.2017 / 14:59

Tags