Remove todos os arquivos com um prefixo exceto o do maior tamanho

6

Qual é a melhor maneira de remover todos os arquivos no diretório atual com algum prefixo, exceto o arquivo com este prefixo, mas com o maior tamanho entre todos os arquivos com este prefixo?

(No caso em que o maior não é único, mantenha aleatoriamente um deles e remova os outros.)

Por exemplo, o diretório atual contém os seguintes arquivos:

-rw-rw----  1 user user 3468 Jan 01 00:00 filea
-rw-rw----  1 user user 3434 Jan 01 00:00 pre_0
-rw-rw-r--  1 user user 9769 Jan 01 00:00 fileb
-rw-rw-r--  1 user user 1950 Jan 01 00:00 filec
-rw-rw-r--  1 user user 8654 Jan 01 00:00 pre_1
-rw-rw----  1 user user 6508 Jan 01 00:00 pre_2

Depois de executar o comando ou o script para remover todos os arquivos com prefixo "pre_", exceto o maior, o diretório atual deve estar listado como:

-rw-rw----  1 user user 3468 Jan 01 00:00 filea
-rw-rw-r--  1 user user 9769 Jan 01 00:00 fileb
-rw-rw-r--  1 user user 1950 Jan 01 00:00 filec
-rw-rw-r--  1 user user 8654 Jan 01 00:00 pre_1
    
por D. Chen 20.06.2016 / 06:00

2 respostas

7

Você pode usar uma combinação de alguns utilitários:

stat -c '%s %n' pre_* | sort -k1,1rn | tail -n +2 | cut -d' ' -f2 | xargs rm

Assumindo o sistema GNU e nenhum nome de arquivo incomum.

  • stat obtém o tamanho do arquivo e o nome separados por espaço para todos os arquivos pre_*

  • sort classifica o arquivo de acordo com o tamanho do arquivo, com o maior tamanho indo para o topo

  • tail -n +2 deixa o restante dos arquivos separados do tamanho máximo

  • cut -d' ' -f2 obtém apenas o nome do arquivo e rm ( xargs rm ) faz a remoção

por 20.06.2016 / 06:18
7

com zsh :

rm -f pre*(OL[2,-1])
  • OL : ordem inversa por tamanho
  • [2,-1] : do segundo ao último apenas

O equivalente aos utilitários bash e GNU seria algo como:

eval "files=($(LC_ALL=C ls --quoting-style=shell-always -dS ./pre*))"
rm -f "${files[@]:1}"

Você pode querer limitá-lo a arquivos regulares, já que o tamanho de arquivos não regulares geralmente não tem muita relevância:

rm -f pre*(.OL[2,-1])

(sem bash direto + equivalente GNU). Você pode incluir links simbólicos para arquivos regulares e considerar o tamanho do destino dos links simbólicos:

rm -f pre*(-.OL[2,-1])

Com ls , adicione a opção -L para considerar o tamanho dos alvos dos links simbólicos.

    
por 20.06.2016 / 08:41