ls -d
lista exatamente o que você passou (exceto os arquivos não existentes). Portanto, supondo que haja pelo menos um diretório cujo nome comece com mydir
, é simplesmente
find mydir*/ -type f -name .mp3 -print0 | …
Observe que mydir*/
corresponde a links simbólicos para diretórios e find
irá percorrer os diretórios vinculados.
Normalmente, xargs
executa o comando o menor número de vezes possível, passando vários argumentos por vez. Se você precisar executar o comando para cada arquivo separadamente, diga-o:
find mydir*/ -type f -name .mp3 -print0 |
xargs -0 -n1 mplayer … |
perl …
Ou faça a coisa simples e use a opção -exec
de find
. Você perde a capacidade de filtrar os erros de find
e mplayer
separadamente.
find mydir*/ -type f -name .mp3 -exec mplayer -vo dummy -ao dummy -identify {} \; 2>/dev/null |
perl …
A propósito, por que imprimir todas as linhas se você só precisa da última?
… | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1); END {printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60}'
No bash depois de executar shopt -s globstar
, em ksh após executar set -o globstar
, ou em zsh fora da caixa, você também pode usar **
para corresponder arquivos em subdiretórios recursivamente.
mycommand mydir*/**/*.mp3
for f in mydir*/**/*.mp3; do …
Isso também corresponde a diretórios e links simbólicos cujo nome termina em .mp3
. O Bash atravessa links simbólicos para diretórios, enquanto o ksh e o zsh atravessam mydir*
se eles são links simbólicos para diretórios, mas omitem links simbólicos quando recursing.
for f in mydir*/**/*.mp3; do
mplayer -vo dummy -ao dummy -identify "$f" 2>/dev/null
done | perl …
ksh93 e zsh (mas não bash, dash ou pdksh) têm aritmética de ponto flutuante, então você nem precisa invocar outra ferramenta como Perl para fazer a soma.
typeset -F length=0
for f in mydir*/**/*.mp3; do
length+=$(mplayer -vo dummy -ao dummy -identify "$f" 2>/dev/null |
sed -n 's/^ID_LENGTH=//p')
done | perl …
printf "%02d:%02d:%02d\n" $((t/3600)) $((t/60%60)) $((t%60))