Encontre os arquivos maiores e exclua automaticamente

0

Eu corro este comando para encontrar os maiores arquivos:

du -Sh | sort -rh | head -5

Então eu faço -rm rf someFile .

Existe uma maneira de excluir automaticamente os arquivos encontrados no comando anterior?

    
por Dan P. 24.07.2017 / 12:51

4 respostas

4

Se você estiver usando ferramentas GNU (que são padrão no linux), você pode fazer algo assim:

stat --printf '%s\t%n
stat --printf '%s\t%n
find . -maxdepth 1 -type f -size +25M -printf '%s\t%p
#!/bin/sh

for d in "$@" ; do
  find "$d" -maxdepth 1 -type f -size +25M -printf '%s\t%p
stat --printf '%s\t%n
stat --printf '%s\t%n
find . -maxdepth 1 -type f -size +25M -printf '%s\t%p
#!/bin/sh

for d in "$@" ; do
  find "$d" -maxdepth 1 -type f -size +25M -printf '%s\t%p%pre%' | 
    sort -z -rn | 
    head -z -n 5 | 
    cut  -z -f 2- |
    xargs -0 -r echo rm -f --
done
' | sort -z -rn | head -z -n 5 | cut -z -f 2- | xargs -0 -r echo rm -f --
' ./* | awk 'BEGIN {ORS = RS = "%pre%" } ; $1 > 25000000' | sort -z -rn | ...
' ./* | sort -z -rn | head -z -n 5 | cut -z -f 2- | xargs -0 -r echo rm -f --
' | sort -z -rn | head -z -n 5 | cut -z -f 2- | xargs -0 -r echo rm -f -- done
' | sort -z -rn | head -z -n 5 | cut -z -f 2- | xargs -0 -r echo rm -f --
' ./* | awk 'BEGIN {ORS = RS = "%pre%" } ; $1 > 25000000' | sort -z -rn | ...
' ./* | sort -z -rn | head -z -n 5 | cut -z -f 2- | xargs -0 -r echo rm -f --

(remova o 'eco' depois de testá-lo).

O comando stat imprime o tamanho do arquivo e o nome de cada arquivo no diretório atual separados por uma guia e com cada registro terminado por um byte NUL (\ 0).

o comando sort classifica cada registro terminado em NUL em ordem numérica reversa. O comando head lista apenas os primeiros cinco desses registros e, em seguida, cut remove o campo de tamanho de arquivo de cada registro.

Finalmente, xargs pega aquela entrada (ainda terminada em NUL) e a usa como argumentos para echo rm -f .

Como isso usa o NUL como o terminador de registro (filename), ele lida com nomes de arquivos que possuem qualquer caractere válido.

Se você deseja um tamanho de arquivo mínimo, insira awk ou algo entre o stat e o sort . por exemplo,

%pre%

NOTA: O GNU awk não possui uma opção -z para registros terminados em NUL, mas permite que você defina o separador de registro como quiser. Temos que definir tanto o separador de registro de saída (ORS) quanto o separador de registro de entrada (RS) para NUL.

Aqui está outra versão que usa find para limitar-se explicitamente a arquivos regulares (ou seja, excluindo diretórios, pipes nomeados, sockets, etc) apenas no diretório especificado ( -maxdepth 1 , no subdirs) que são maiores que 25M em tamanho (não há necessidade de awk ).

Esta versão não precisa de stat porque o GNU find também possui um recurso printf . BTW, observe a diferença na string de formato - stat usa %n para o nome do arquivo, enquanto find usa %p .

%pre%

Para executá-lo para um diretório diferente, substitua o . no comando find. por exemplo. find /home/web/ ....

versão do script de shell:

%pre%

salve-o como, por exemplo, delete-five-largest.sh em algum lugar em seu PATH e execute-o como delete-five-largest.sh /home/web /another/directory /and/yet/another

Isso executa o find ... uma vez para cada diretório especificado na linha de comando. Isso é NÃO o mesmo que executar find uma vez com vários argumentos de caminho (o que seria parecido com find "$@" ... , sem nenhum loop for no script). Exclui os 5 maiores arquivos em cada diretório, enquanto executá-lo sem o loop for excluiria apenas os cinco maiores arquivos encontrados durante a pesquisa em todos os diretórios. ou seja, cinco por diretório versus cinco no total.

    
por 24.07.2017 / 13:17
4

Com ferramentas GNU recentes (você já está usando opções específicas do GNU):

du -S0 . |sort -zrn | sed -z 's@[^/]*@.@;5q' | xargs -r0 echo rm -rf

(remova echo se estiver feliz).

O -0 / -z é capaz de copiar arquivos / diretórios com nomes arbitrários.

Note que a maioria das implementações de rm se recusará a remover . (o diretório de trabalho atual), então você pode querer fazer isso de um nível acima e fazer:

du -S0 dir | sort -zrn | sed -z 's@\s*\d+\s*@@;5q' | xargs -r0 echo rm -rf

Por isso, pode remover dir se esse for um dos maiores arquivos (note que também removeria todos os subdiretórios). Não está claro a partir de suas necessidades se é realmente o que você quer.

Agora, se tudo o que você quer é remover os 5 maiores arquivos regulares (excluindo outros tipos de arquivos como diretórios, dispositivos, links simbólicos ...), é apenas uma questão de usar zsh e:

echo rm -f ./**/*(D.OL[1,5])

( OL é para ordenar inversamente por tamanho (tamanho, não uso do disco)).

    
por 24.07.2017 / 13:24
0

Aqui você tem um loop (subshell intensivo) para cada arquivo. Substitua o echo pelo seu comando rm:

du -Sh /your/search/path/ |\
sort -rh |\
head -5 |\
awk '{print $2}' |\
while read file ; do
  echo "$file"
done

Funciona em uma festança acutal. Mas isso é outra coisa senão um bom roteiro. E tenho certeza de ganhar alguns comentários por causa dos espaços em branco dentro dos nomes dos arquivos. ;) Eles são bem vindos!

Se você estiver familiarizado com tarefas cron, execute este script periodicamente.

    
por 24.07.2017 / 13:15
0

Aqui está uma resposta simples que, esperamos, o ajude - 'find / -type f -size 1G -exec rm {} \;' Isto irá encontrar qualquer arquivo sob a raiz que seja um arquivo, não um diretório, que tenha mais de 1G de tamanho, e irá removê-lo. Você pode adicionar uma classificação extra de arquivos após o exec, se precisar escolher um arquivo por nome, por exemplo. O tamanho pode ser alterado para M (megabytes), k (kilobytes), c (bytes). Há muitas opções para encontrar e é um comando poderoso, confira a man page! :)

    
por 24.07.2017 / 16:00