Como posso criar um arquivo compactado que consiste nos maiores arquivos de vários diretórios?

1

Eu quero escrever um script que irá criar um único arquivo comprimido que consiste nos maiores arquivos acima de um certo limite de múltiplos diretórios. Por exemplo, gostaria de saber como obter os 5 maiores arquivos acima de 2 MB e colocá-los em um arquivo compactado chamado largestfile.tar.gz . Aqui está o que eu tenho até agora:

du -a $path | sort -n -r | head -n 5 > diskspacefile.txt
file=$(cat diskspacefile.txt)
while read p; do
    filesize=echo $p | awk '{print $1 }'
    if [ $filesize > 2000000 ] 
    then
        zipfile='echo $p | awk '{print $2 }''
        tar -zcvf largestfile.tar.gz $zipfile
    fi
done

Infelizmente, isso parece não funcionar. Quando o executo, ou obtenho apenas um único arquivo no arquivo ou nenhum arquivo. Para o contexto, os diretórios nos quais estou interessado em aplicar isso são /root e /boot (ou seja, esses serão os valores da variável path no snippet de código).

    
por Suganthan Raj 10.01.2017 / 19:39

1 resposta

0

Primeiro, observe que podemos usar find para gerar uma lista de todos os arquivos maiores que 2 MB em um determinado diretório:

find . -type f -size +2M

Queremos extrair os 5 maiores arquivos dessa lista. Para fazer isso, podemos usar a opção -printf para imprimir tanto o caminho do arquivo quanto o tamanho do arquivo (em bytes), da seguinte forma:

find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n'

Agora podemos classificar esses resultados por tamanho de arquivo (em ordem decrescente) e os cinco principais resultados dessa lista de pedidos:

find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1

Em seguida, removemos o tamanho do arquivo para recuperar os caminhos relativos para os 5 maiores arquivos acima de 2M no diretório atual:

find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1 | head -n 5 | cut -d: -f2-

Por fim, podemos passar essa lista de caminhos de arquivo para o comando tar para criar um arquivo zipado desses arquivos:

tar czf largestfile.tar -T <(find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1 | head -n 5 | cut -d: -f2-)
    
por 21.11.2017 / 07:48