sábado, 17 de março de 2012

perlbrew em Ubuntu 11.10

O perlbrew é um utilitário que permite instalar e utilizar várias versões de Perl, obviando a necessidade de mexer no Perl do sistema (em regra, uma má ideia).

Sucede, contudo, que as versões mais recentes de Ubuntu (eventualmente, também Debian) não permitem compilar os perls sem introduzir opções adicionais de compilação.

As linhas seguintes permitem instalar a versão 5.14.2 via perlbrew em sistemas de 32 e 64 bits, respetivamente:


$ perlbrew install perl-5.14.2 -Dusethreads -Duselargefiles -Dcccdlflags=-fPIC -Dpager=/usr/bin/sensible-pager -Doptimize=-O2 -Duseshrplib -Darchname=i386-linux-gnu -Dccflags=-DDEBIAN -Dplibpth=/usr/lib/i386-linux-gnu


$ perlbrew install perl-5.14.2 -Dusethreads -Duselargefiles -Dcccdlflags=-fPIC -Dpager=/usr/bin/sensible-pager -Doptimize=-O2 -Duseshrplib -Duse64bitall -Darchname=x86_64-linux-gnu -Dccflags=-DDEBIAN -Dplibpth=/usr/lib/x86_64-linux-gnu

quarta-feira, 7 de março de 2012

Listar ficheiros por ordem decrescente de tamanhos (parte 2)

Depois de ter mostrado como listar ficheiros por ordem decrescente de tamanhos com os chamados utilitários Unix como egrep e awk, é interessante criar a mesma solução com perl:

$ perl -E 'for (sort { -s ($b) <=> -s ($a) } <*>) { say -s, " $_" if (-f); };'

Cuidado: este one-liner (programa numa linha) está carregado de defaults.

Curiosamente, este programa permitiu detetar um bug no anterior: os nomes dos ficheiros aparecem truncados se houver espaços no nome. Além disso, conseguimos listar aqui apenas ficheiros 'comuns' (não são incluídos ficheiros 'especiais' como ficheiros de dispositivos ou sockets).

O alias correspondente seria

alias listar_dec="perl -E 'for (sort { -s (\$b) <=> -s (\$a) } <*>) { say -s, \" \$_\" if (-f); };'"

Listar ficheiros por ordem decrescente de tamanhos

Tenho muitas vezes problemas de falta de espaço em disco e preciso rapidamente de saber o que posso apagar.
Uma forma simples de listar os ficheiros de um diretório, ordenando-os por ordem decrescente de tamanhos, é:

$ ls -l| egrep -v "^d|total"| awk '{print $5, $NF}'| sort -nr| less

ls -l dá uma listagem longa de ficheiros, com colunas separados por whitespace (termo que designa carateres como espaço ou tabulador (\t)). O awk aceita outros carateres como separadores de colunas (via -F), mas aceita whitespace como separador por omissão.
$5 corresponde à 5ª coluna (tamanho de ficheiro) e $NF corresponde à última coluna (NF é number of fields).
egrep -v "^d|total" exclui (-v) linhas iniciadas com d (diretórios) ou com o texto total.

Esta linha pode naturalmente ser colocada num alias (em ~/.bashrc para shell Bash):

alias listar_dec='ls -l| egrep -v "^d|total"| awk "{ print \$5, \$NF }"| sort -nr| less'
Os carateres $ têm de ser "escapados" por terem significado simultaneamente para a shell e para o awk.

Depois de 'recarregar' o .bashrc (. ~/.bashrc), basta usar no diretório pretendido
$ listar_dec

Finalmente, o utilitário sort pode ser dispensado se ls for usado com a opção -S (ls -lS).