Se você estiver usando ferramentas GNU (que são padrão no linux), você pode fazer algo assim:
stat --printf '%s\t%nstat --printf '%s\t%nfind . -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%pstat --printf '%s\t%nstat --printf '%s\t%nfind . -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,
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
.
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.