mercoledì 31 ottobre 2012

Archlinux: uno script (in perl) per trovare i file che non appartengono a nessun pacchetto installato

In alternativa ad un comando del tipo:

$ find /usr/bin/ -execdir pacman -Qo {} \;

ho realizzato un script perl che svolge la medesima funzione (ossia analizzare il filesystem alla ricerca dei file non appartenenti a nessun pacchetto installato) con il vantaggio però di essere molto più performante rispetto all'invocazione continua di "pacman -Qo"
Ho chiamato il mio script leftover (in inglese "rimasuglio", "avanzo")
#!/usr/bin/perl
# leftover.pl
use warnings;
use strict;
use File::Find;
use File::Slurp;
use File::Spec;
use feature 'say';
my $dir=$ARGV[0];
die ":: Uso: $0 <directory>\n" unless (scalar @ARGV == 1);
die qq{:: Directory non valida: "$dir"\n} unless -d $dir;
die qq{:: "$dir" non è un percorso assoluto\n"} unless File::Spec->file_name_is_absolute($dir);
my @files;
my @db = qx(pacman -Ql);
say ":: Ricerca in corso dei file non appartenenti a nessun pacchetto ...";
find({ wanted => \&process, follow_skip => 2 }, $dir);
if (@files)
{
    write_file('/tmp/leftover.txt', @files);
    say q{:: Risultati della ricerca salvati in "/tmp/leftover.txt"};
}
else
{
    say ':: Nessun file trovato';
}

sub process{
    return if -d "$File::Find::name";
    my $check;
    my $f = quotemeta($File::Find::name);
    for (@db)
    {
        if ($_ =~ /^\S+\s$f/)
            {
                $check = 1;
                last;
            }
    }
    if (! $check)
    {
        say ">$File::Find::name";
        push @files, "$File::Find::name\n";
    }
}

L'utilizzo è molto semplice, basta dare:

$ leftover.pl <path da analizzare>

Ovviamente avrebbe poco senso passare come path /home o /tmp  oppure directory speciali come /proc o /sys all'interno delle quali nessun pacchetto va a collocare file.
Tenete anche in considerazione che analizzare path contenenti molti file e molti livelli di sottodirectory (come ad esempio /usr) potrebbe richiedere parecchio tempo!
Unica dipendenza richiesta per poter eseguire lo script è perl-file-slurp.
I risultati della ricerca verranno salvati nel file /tmp/leftover.txt per un'agevole consultazione.

giovedì 25 ottobre 2012

Come creare una file di configurazione per GNU Bc

Bc, il noto linguaggio di programmazione usato per calcoli a precisione arbitraria, non supporta direttamente la possibilità di mantenere in un file di configurazione le nostre impostazioni personalizzate.
E' possibile abilitare tale funzionalità tramite la variabile d'ambiente BC_ENV_ARGS in questo modo:

1) creiamo un file nella nostra home dal nome .bc
2) inseriamo nel file le impostazioni che desideriamo cambiare; le variabili che il programma riconosce sono scale (numero di decimali dopo la virgola, default è zero) e ibase/obase (per convertire l'input/output in basi diverse da quella decimale). Se ad esempio volessimo impostare il numero di cifre decimali a due, scriveremmo semplicemente scale=2. É inoltre possibile definire funzioni personalizzate, in modo da averle immediatamente disponibili ad ogni avvio del programma.
3) apriamo il file .bashrc nella nostra home e aggiungiamo la seguente linea:
export BC_ENV_ARGS=~/.bc

Apriamo una nuova istanza del nostro terminale preferito per rendere attive le modifiche al file ~/.bashrc

martedì 23 ottobre 2012

Concatenare file Vob di un dvd in un unico file

In questo articolo vi spiegherò come unire in maniera veramente semplice i file Vob di un dvd-video in modo da generare un unico file. Il file così ottenuto potrà essere facilmente dato in pasto a tool come mencoder, ffmpeg, ecc. per la conversione in altri formati video.
Il processo in pratica consiste nel passare al comando cat l'elenco ordinato di tutti i Vob del nostro dvd, ad eccezione del file VIDEO_TS.VOB e dei file dal nome VTS_xx_0.VOB (quelli cioè relativi a menu e contenuti riprodotti in automatico all'apertura del dvd).
Possiamo automatizzare il tutto con un piccolo script bash:

# creiamo l'elenco dei file Vob
ls -1 *.VOB > lista
# rimuoviamo VIDEO_TS.VOB e i file VTS_01_0.VOB, VTS_02_0.VOB, ecc
sed -e /VIDEO_TS.VOB/d -e /_0.VOB/d -i lista

Supponiamo che il nostro dvd contenga i seguenti file:
VIDEO_TS.VOB
VTS_01_0.VOB
VTS_01_1.VOB
VTS_01_2.VOB
VTS_01_3.VOB
VTS_02_0.VOB
VTS_02_1.VOB
VTS_02_2.VOB
VTS_02_3.VOB
VTS_02_4.VOB
VTS_03_0.VOB
VTS_03_1.VOB
VTS_04_0.VOB
VTS_04_1.VOB


dopo aver eseguito i precedenti comandi il file lista avrà questo contenuto:
VTS_01_1.VOB
VTS_01_2.VOB
VTS_01_3.VOB
VTS_02_1.VOB
VTS_02_2.VOB
VTS_02_3.VOB
VTS_02_4.VOB
VTS_03_1.VOB
VTS_04_1.VOB


# ultimo passo: concateniamo i VOB in un unico file
cat $(cat lista) > video.vob

Ecco fatto, il nostro file è pronto! Ora, ad esempio, potremmo passarlo a ffmpeg per ottenere un video in formato MPEG4, mantenendo la qualità del filmato originale:

$ ffmpeg -i video.vob -aspect 16:9 -sameq -acodec copy video.mp4

Se siete interessati ad approfondire l'utilizzo di ffmpeg vi suggerisco la relativa pagina dell'ottimo Wiki di Archlinux