Analisando o comando 'find'

2

O comando a seguir me informa o tamanho dos arquivos de vídeo mp4:

find -type f -name "*.mp4" -print0 | \
   xargs -0  mplayer -vo dummy -ao dummy -identify 2>/dev/null | \
   perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | \
   tail -n 1

Alguém pode analisá-lo e explicar por que é assim?

Também seria útil saber como usá-lo várias vezes sem redigitá-lo ou copiá-lo e colá-lo.

    
por Entrio Parton 25.01.2013 / 19:05

1 resposta

12

find -type f -name "*.mp4" -print0

Pesquise recursivamente no diretório atual os arquivos normais cujos nomes terminam com .mp4 e imprima seus nomes de caminho relativos, separados por bytes nulos. -print0 é mais seguro que -print aqui, porque novas linhas são caracteres válidos em um nome de arquivo. encontrar (1)

| xargs -0

Use a entrada como argumentos para o próximo comando. A entrada é separada por nulo. xargs (1)

mplayer -vo dummy -ao dummy -identify 2>/dev/null

Este é o comando em que xargs está sendo executado. Usando drivers de áudio e vídeo fictícios, mostre os parâmetros de arquivo em um formato facilmente analisável. Descarte qualquer saída de STDERR. mplayer (1)

| perl -nle

Canalize a saída para Perl. Perl lerá linhas de entrada na variável $_ , retirando novas linhas do final. perlrun (1)

/ID_LENGTH=([0-9\.]+)/

Se a linha corresponder a essa expressão regular, capture o número após "ID_LENGTH=",

&& ($t +=$1)

em seguida, aumente a variável $t pelo número capturado na primeira correspondência,

&& printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60'

e calcule horas, minutos e segundos de $t , que é uma contagem de segundos. Por causa do -l na invocação do perl, uma nova linha é adicionada automaticamente às instruções print , mas não printf , portanto, a cadeia de formatações contém uma ("\ n").

| tail -n 1

Imprima apenas a última linha de saída. final (1)

Para tornar este pipeline em um único comando, você pode criar uma função de shell no seu .bashrc ou qualquer outro arquivo-rc que seu shell use. Aqui está um exemplo:

vid_lengths() {
  find -type f -name "*.mp4" -print0 \
    | xargs -0  mplayer -vo dummy -ao dummy -identify 2>/dev/null \
    | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' \
    | tail -n 1
}
    
por 25.01.2013 / 19:35