Por que esse script não produz saída?

1

Estou tentando escrever um script bash que analisa os arquivos de vídeo em uma pasta para exibir a duração total do vídeo nessa pasta imediata e a duração do vídeo nessa pasta, além de todas as suas subpastas. Meu código é:

#!/bin/bash

### Outputs the total duration of video in each folder (recursively).
##  Incase an argument is not provided, the basefolder is assumed to be pwd.

# Defining custom Constants & functions
RED='3[1;31m'
GREEN='3[1;32m'
YELLOW='3[1;33m'
BLUE='3[1;34m'
NC='3[0m' # No Color

echoErr() { 
    echo -e "${RED}[ERROR]${NC}: $@" 1>&2
    exit
}

folderTime() {
    echo $(find . -maxdepth 1 -iname '*.mp4' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; | paste -sd+ -| bc)
}

# Setting the base directory
if [ "$#" -lt 1 ]; then
    baseDir="$(pwd)"
else
    baseDir="$1"
fi

cd "$baseDir" || echoErr "Error switching to $baseDir"

# Actual calculation of the total video duration in each folder - using a function.
totalTime=0
function calcTime() {
    local incomingTime=$totalTime
    local newTotalTime=0
    local immediateTime=0
    newTotalTime=immediateTime=$(folderTime)
    for f in "$1"*
    do
        if [ -d "$f" ]; then
            cd "$f" || echoErr "Can't switch to $f" 
            calcTime "$f"
            newTotalTime=$(( $newTotalTime + $totalTime ))
        fi
    done
    totalTime=$(( $newTotalTime + $incomingTime ))
    echo -e "The duration of video in just $f is : \t\t${BLUE}$immediateTime${NC}"
    echo -e "The Total duration of video in $f and subfolders is : \t${GREEN}$totalTime${NC}"
}
calcTime "$baseDir"

O código acima não produz nenhuma saída, mas a execução também não é interrompida. Tenho certeza que ser novo no bash scripting, eu fiz algum tipo de erro (s), mas para a vida de mim, não consigo descobrir exatamente o que é. Por favor ajude.

Além disso, por favor me diga todas e quaisquer formas de melhorar este script. Obrigado!

    
por Somenath Sinha 25.10.2017 / 05:48

1 resposta

3

Você acidentalmente se codificou em um loop recursivo. O problema está dentro da sua função calcTime() :

for f in "$1"*

Quando você chama pwd , ele deixa a barra final. Então, for f in "$1"* se transforma em for f in "/my/current/directory*" , que sempre define f para /my/current/directory .

Como você chama calcTime() de dentro desse loop, ele recorre infinitamente. Se você alterar a definição de loop for para o seguinte, acho que deve se comportar melhor:

for f in "$1"/*
    
por 25.10.2017 / 06:14