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
}