My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# ----------------------------------------------------------------------------
# Acha os maiores arquivos/diretórios do diretório atual (ou outros).
# Opções: -r busca recursiva nos subdiretórios
# -f busca somente os arquivos e não diretórios
# -n número de resultados (o padrão é 10)
# Uso: zzmaiores [-r] [-f] [-n <número>] [dir1 dir2 ...]
# Ex.: zzmaiores
# zzmaiores /etc /tmp
# zzmaiores -r -n 5 ~
#
# Autor: Aurelio Marinho Jargas, www.aurelio.net
# Desde: 2001-08-28
# Licença: GPL
# ----------------------------------------------------------------------------
zzmaiores ()
{
zzzz -h maiores "$1" && return

local pastas recursivo modo tab resultado
local limite=10

# Opções de linha de comando
while [ "${1#-}" != "$1" ]
do
case "$1" in
-n)
limite=$2
shift; shift
;;
-f)
modo='f'
shift
# Até queria fazer um -d também para diretórios somente,
# mas o du sempre mostra os arquivos quando está recursivo
# e o find não mostra o tamanho total dos diretórios...
;;
-r)
recursivo=1
shift
;;
*)
break
;;
esac
done

if [ "$modo" = 'f' ]
then
# Usuário só quer ver os arquivos e não diretórios.
# Como o 'du' não tem uma opção para isso, usaremos o 'find'.

# Se forem várias pastas, compõe a lista glob: {um,dois,três}
# Isso porque o find não aceita múltiplos diretórios sem glob.
# Caso contrário tenta $1 ou usa a pasta corrente "."
if [ "$2" ]
then
pastas=$(echo {$*} | tr -s ' ' ',')
else
pastas=${1:-.}
[ "$pastas" = '*' ] && pastas='.'
fi

tab=$(echo -e '\t')
[ "$recursivo" ] && recursivo= || recursivo='-maxdepth 1'

resultado=$(
find $pastas $recursivo -type f -ls |
tr -s ' ' |
cut -d' ' -f7,11- |
sed "s/ /$tab/" |
sort -nr |
sed "$limite q"
)
else
# Tentei de várias maneiras juntar o glob com o $@
# para que funcionasse com o ponto e sem argumentos,
# mas no fim é mais fácil chamar a função de novo...
pastas="$@"
if [ ! "$pastas" -o "$pastas" = '.' ]
then
zzmaiores ${recursivo:+-r} -n $limite * .[^.]*
return

fi

# O du sempre mostra arquivos e diretórios, bacana
# Basta definir se vai ser recursivo (-a) ou não (-s)
[ "$recursivo" ] && recursivo='-a' || recursivo='-s'

# Estou escondendo o erro para caso o * ou o .* não expandam
# Bash2: nullglob, dotglob
resultado=$(
du $recursivo "$@" 2>/dev/null |
sort -nr |
sed "$limite q"
)
fi
# TODO é K (nem é, só se usar -k -- conferir no SF) se vier do du e bytes se do find
echo "$resultado"
# | while read tamanho arquivo
# do
# echo -e "$(zzbyte $tamanho)\t$arquivo"
# done
}

Change log

r710 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: $1 colocado entre aspas na
chamada padrão zzzz -h de todas as
funções.
Go to: 
Sign in to write a code review

Older revisions

r668 by aureliojargas on Mar 28, 2012   Diff
lint: removendo espaços inúteis.
r655 by aureliojargas on Mar 23, 2012   Diff
s/Aurélio/Aurelio/ *
r486 by aureliojargas on May 20, 2011   Diff
COMBO: Arrumadas inconsistências de
espaços em branco na indentação de
várias funções. Foi usado o script
'alinhamento' para encontrar os
problemas. Estas alterações não mudam
...
All revisions of this file

File info

Size: 2713 bytes, 104 lines
Powered by Google Project Hosting