Qualche software di rilevamento beat per Linux? [chiuso]


29

Amarok 2 può cercare attraverso la raccolta musicale usando il campo 'bpm' del tag ID3v2. Sarebbe molto bello ridisegnare l'intera collezione musicale in modo che io possa trovare l'umore della traccia che mi piace.

Tuttavia non ho trovato alcun software di rilevamento dei battiti che mi avrebbe potuto aiutare. Ne hai mai usato uno? CLI, preferibilmente. Inoltre sono interessato se c'è qualcosa di simile per taggare i FLAC con lo stesso campo 'bpm'.

Grazie! :)

PS Sono consapevole che c'è una bella funzione moodbar, tuttavia è inutile per la ricerca.


3
hai visto questa pagina? mmartins.com/mmartins/bpmdetection/bpmdetection.asp Sembra esattamente quello che stai cercando.
DaveParillo,

@DaveParillo quel link "mood of a track" è un collegamento al tuo hard disk e come tale inutile per chiunque tranne te
Justin Smith,

@Justin Smith, intendeva un file nei documenti di BpmDj :) Ecco la versione online: bpmdj.yellowcouch.org/clustering.html
kolypto

@Justin - scusa - dito innervosito, immagino.
DaveParillo,

Risposte:


17

Sul sito DaveParillo mi ha suggerito di aver trovato il progetto BpmDj . Ha un bpmcounteseguibile che calcola il bpm molto bene: gestisce mp3 e flac:

161.135 Metallica/2008 - Death Magnetic/01-That Was Just Your Life.flac
63.5645 Doom3.mp3

L'unica cosa che resta da fare è riassegnare la collezione. Aggiornerò questa risposta ogni volta che avrò successo. Grazie! :)


Passo 1

Corri bpmcountcontro l'intera raccolta e archivia i risultati in un file di testo. Il problema è che si bpmcountblocca di tanto in tanto e cerca di consumare fino a 2 GB di memoria quando elabora diversi file, quindi dovremmo alimentarlo con i nomi dei file uno per uno. Come questo:

musicdir='/home/ootync/music'
find "$musicdir" -iregex ".*\.\(mp3\|ogg\|flac\|ape\)" -exec bpmcount {} \; \
    | fgrep "$musicdir" > "$musicdir/BPMs.txt"

Passo 2

Avremo bisogno di alcuni pacchetti aggiuntivi: apt-get install vorbis-tools flac python-mutagen. Ora dai un'occhiata a come è possibile aggiungere il tag 'bpm':

mid3v2 --TBPM 100 doom3.mp3
vorbiscomment -a -t "BPM=100" mother.ogg
metaflac --set-tag="BPM=100" metallica.flac

Ahimè, non ho tracce * .ape

Ora abbiamo i BPM e l'intera collezione dovrebbe essere ricodificata. Ecco la sceneggiatura:

cat "$musicdir/BPMs.txt" | while read bpm file ; do
    bpm=`printf "%.0f" "$bpm"` ;
    case "$file" in 
        *.mp3) mid3v2 --TBPM "$bpm" "$file" > /dev/null ;; 
        *.ogg) vorbiscomment -a -t "BPM=$bpm" "$file" ;; 
        *.flac) metaflac --set-tag="BPM=$bpm" "$file" ;; 
        esac
    done

Passaggio 2.1 Rivisto Ecco uno script che aggiungerà i tag BPM alla tua raccolta.

Esegue un processo per CPU Core per velocizzare il processo. Inoltre, non utilizza file temporanei ed è in grado di rilevare se un file è già taggato.

Inoltre, ho scoperto che a volte FLAC ha sia ID3 che VorbisComment all'interno. Questo script aggiorna entrambi.

#!/bin/bash

function display_help() {
    cat <<-HELP
            Recursive BPM-writer for multicore CPUs.
            It analyzes BPMs of every media file and writes a correct tag there.
            Usage: $(basename "$0") path [...]
            HELP
    exit 0
    }

[ $# -lt 1 ] && display_help

#=== Requirements
requires="bpmcount mid3v2 vorbiscomment metaflac"
which $requires > /dev/null || { echo "E: These binaries are required: $requires" >&2 ; exit 1; }

#=== Functions

function bpm_read(){
    local file="$1"
    local ext="${file##*.}"
    declare -l ext
    # Detect
    { case "$ext" in
        'mp3')  mid3v2 -l "$file" ;;
        'ogg')  vorbiscomment -l "$file" ;;
        'flac') metaflac --export-tags-to=- "$file" ;;
        esac ; } | fgrep 'BPM=' | cut -d'=' -f2
    }
function bpm_write(){
    local file="$1"
    local bpm="${2%%.*}"
    local ext="${file##*.}"
    declare -l ext
    echo "BPM=$bpm @$file"
    # Write
    case "$ext" in
        'mp3')  mid3v2 --TBPM "$bpm" "$file" ;;
        'ogg')  vorbiscomment -a -t "BPM=$bpm" "$file" ;;
        'flac') metaflac --set-tag="BPM=$bpm" "$file"
                mid3v2 --TBPM "$bpm" "$file" # Need to store to ID3 as well :(
                ;;
        esac
    }

#=== Process
function oneThread(){
    local file="$1"
    #=== Check whether there's an existing BPM
        local bpm=$(bpm_read "$file")
        [ "$bpm" != '' ] && return 0 # there's a nonempty BPM tag
    #=== Detect a new BPM
    # Detect a new bpm
    local bpm=$(bpmcount "$file" | grep '^[0-9]' | cut -f1)
    [ "$bpm" == '' ] && { echo "W: Invalid BPM '$bpm' detected @ $file" >&2 ; return 0 ; } # problems
    # Write it
    bpm_write "$file" "${bpm%%.*}" >/dev/null
    }

NUMCPU="$(grep ^processor /proc/cpuinfo | wc -l)"
find $@ -type f -regextype posix-awk -iregex '.*\.(mp3|ogg|flac)' \
    | while read file ; do
        [ `jobs -p | wc -l` -ge $NUMCPU ] && wait
        echo "$file"
        oneThread "$file" &
        done

Godere! :)


Eccellente! Non ero riuscito a provare l'ultima notte. Per quanto riguarda il tagging della riga di comando, prova mid3v2: linux.die.net/man/1/mid3v2 , utile almeno fino a quando Ex Falso non supporta la modifica della riga di comando. L'id tad id3v2 èTBPM
DaveParillo,

1
Grazie, proverò tra un paio di giorni e pubblicherò i risultati :) Mi chiedo se FLAC supporti tale cosa: dovrò dare un'occhiata.
Kolypto,

1
Bel lavoro sul passaggio 2. Vorrei poter votare due volte!
DaveParillo,

1
Grazie :) Ahimè, il mio Amarok non ha notato il nuovo bug nei FLAC che mi piace di più :)).
Kolypto,

Come lo hai installato? il numero di giri che forniscono non sembra funzionare nel mio computer e sto lottando con la compilazione.
pedrosaurio,


6

Ho usato lo script originale di kolypto usando bpmcounte riscritto per bpm-tag(utility bpm-tools) di cui ho avuto più fortuna con l'installazione. Ho anche apportato alcuni miglioramenti.

Puoi trovarlo su GitHub https://github.com/meridius/bpmwrap


Ciò ha richiesto alcune modifiche per funzionare su un Mac, che ho incluso nella mia risposta di seguito (perché è troppo lungo per un commento)
Adrian

2

Non conosco uno strumento che fa esattamente quello che stai cercando, ma ho giocato con MusicIP .

Usata la versione linux / java - ci vuole molto tempo per analizzare completamente una libreria musicale, ma funziona davvero. Puoi trovare brani simili ad altri brani. È possibile fare clic con il tasto destro sulla playlist generata e selezionare l'opzione per selezionare più o meno brani musicali come quello selezionato. Puoi anche scegliere di eliminare determinati generi. È un po 'bello, ma dopo che il fattore wow svanì, ho smesso di usarlo.

La versione gratuita esporta playlist fino a 75 brani in (almeno) formato m3u.

Al momento non è supportato, ma penso che abbiano provato a pubblicarlo come Predexis .


1

Anche se non è solo uno strumento come dici che stai cercando, Banshee media player è in grado di rilevare bpm.

Uso Banshee per tutta la mia musica, riproduzione, organizzazione e sincronizzazione con lettori portatili. Non sono affiliato, ma mi piace il programma il migliore di tutti quelli che ho provato. Può anche generare "playlist intelligenti" basate su tutti i tipi di proprietà delle tracce, incluso bpm.

C'è un'estensione che analizza ogni sorta di cose sulla canzone e troverà canzoni simili a quella che stai suonando. Si chiama Mirage , e l'ho usato per un po ', ma non lo faccio più, poiché ho creato un numero di playlist di quelle che si adattano a vari stati d'animo (non necessariamente simili secondo Mirage).

Non so se Banshee salverà i bpm rilevati nel tag "bpm" ID3v2 del file. Se qualcuno sa come controllare facilmente il tag bpm dall'esterno del programma, lo controllerò.



0

Ho trovato un altro strumento per taggare i file MP3 con il valore BPM corretto.

Si chiama BPMDetect . Open-source. Le librerie QT funzionano bene con Gnome. Viene fornito con una GUI ma può essere compilato come versione solo console (eseguire "scons console = 1" come indicato nel file readme.txt).

Altrimenti, alla fine, ho usato troppo il "bpmcount" di BpmDJ poiché avevo difficoltà a compilare BPMDetect su un host Ubuntu a 64 bit (a causa della dipendenza fmodex). Quindi ho preso lo script di shell (molto bello e ben scritto) sopra (vedi sotto), il binario "bpmcount" estratto dal [x64 .rpm] [3] disponibile sul sito web di BpmDJ (ho appena estratto il .rpm con

pm2cpio bpmdj-4.2.pl2-0.x86_64.rpm|cpio -idv

e ha funzionato come un fascino. Ho dovuto solo modificare lo script sopra dato che, fuori dalla scatola, non funzionava dalla mia parte (problema con stdout / stderr del binario bpmcount). La mia modifica riguarda il reindirizzamento dei file:

local bpm=$(bpmcount "$file" 3>&1 1>/dev/null 2>&3 | grep '^[0-9]' | cut -f1)

0

C'è un altro strumento raccomandato in questa domanda su StackOverflow: aubio , che viene fornito con i moduli Python.

Non l'ho provato perché ero un po 'impegnato a occuparmi della compilazione di BpmDj . Nel caso in cui qualcun altro si trovi ad affrontare problemi simili durante il tentativo, mi raccomando caldamente di assicurarmi assolutamente:

  1. aver scaricato l'ultima versione delle fonti BpmDj
  2. avendo installato le librerie boost appropriate

Con gli ultimi aggiornamenti del compilatore g ++, alcuni problemi sembrano essere sorti soprattutto riguardo alle recenti versioni di Debian e Ubuntu. Non appena è venuto a conoscenza di questi problemi, l'autore ha avuto la gentilezza di correggere le incompatibilità emerse e mettere insieme una nuova versione che ora si compila come un fascino. Quindi, chiunque sia stato vicino a cadere nella disperazione per gli errori di compilazione implacabili di recente: ora stai risparmiando.

@ Mmx , gli strumenti di guardare bene anche, ma si basano su SoX, che di default non ha caratteristiche MP3. Quindi richiedono prima di compilare SoX con il supporto Lame / MAD, che sfortunatamente è uno sforzo eccessivo per le persone pigre come me.


0

Per far funzionare la soluzione di @meridius sul mio Mac ho dovuto fare un po 'di lavoro extra e modificare un po' lo script:

# Let's install bpm-tools
git clone http://www.pogo.org.uk/~mark/bpm-tools.git
cd bpm-tools
make && make install
# There will be errors, but they did not affect the result

# The following three lines could be replaced by including this directory in your $PATH
ln -s <absolute path to bpm-tools>/bpm /usr/local/bin/bpm
ln -s <absolute path to bpm-tools>/bpm-tag /usr/local/bin/bpm-tag
ln -s <absolute path to bpm-tools>/bpm-graph /usr/local/bin/bpm-graph
cd ..

# Time to install a bunch of GNU tools
# Not all of these packages are strictly necessary for this script, but I decided I wanted the whole GNU toolchain in order to avoid this song-and-dance in the future
brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt bash flac vorbis-tools
brew tap homebrew/dupes; brew install grep

# Now for Mutagen (contains mid3v2)
git clone https://github.com/nex3/mutagen.git
cd mutagen
./setup.py build
sudo ./setup.py install
# There will be errors, but they did not affect the result
cd ..

Quindi ho dovuto modificare lo script per indicare le versioni GNU di tutto e alcune altre modifiche:

#!/usr/local/bin/bash

# ================================= FUNCTIONS =================================

function help() {
    less <<< 'BPMWRAP

Description:
    This BASH script is a wrapper for bpm-tag utility of bpm-tools and several
    audio tagging utilities. The purpose is to make BPM (beats per minute)
    tagging as easy as possible.
    Default behaviour is to look through working directory for *.mp3 files
    and compute and print their BPM in the following manner:
        [current (if any)] [computed] [filename]

Usage:
    bpmwrap [options] [directory or filenames]

Options:
    You can specify files to process by one of these ways:
        1) state files and/or directories containing them after options
        2) specify --import file
        3) specify --input file
    With either way you still can filter the resulting list using --type option(s).
    Remember that the script will process only mp3 files by default, unless
    specified otherwise!

    -i, --import file
        Use this option to set BPM tag for all files in given file instead of
        computing it. Expected format of every row is BPM number and absolute path
        to filename separated by semicolon like so:
            145;/home/trinity/music/Apocalyptica/07 beyond time.mp3
        Remember to use --write option too.
    -n, --input file
        Use this option to give the script list of FILES to process INSTEAD of paths
        where to look for them. Each row whould have one absolute path.
        This will bypass the searching part and is that way useful when you want
        to process large number of files several times. Like when you are not yet
        sure what BPM limits to set. Extension filtering will still work.
    -o, --output file
        Save output also to a file.
    -l, --list-save file
        Save list of files about to get processed. You can use this list later
        as a file for --input option.
    -t, --type filetype
        Extension of file type to work with. Defaults to mp3. Can be specified
        multiple times for more filetypes. Currently supported are mp3 ogg flac.
    -e, --existing-only
        Only show BPM for files that have it. Do NOT compute new one.
    -w, --write
        Write computed BPM to audio file but do NOT overwrite existing value.
    -f, --force
        Write computed BPM to audio file even if it already has one. Aplicable only
        with --write option.
    -m, --min minbpm
        Set minimal BPM to look for when computing. Defaults to bpm-tag minimum 84.
    -x, --max maxbpm
        Set maximal BPM to look for when computing. Defaults to bpm-tag maximum 146.
    -v, --verbose
        Show "progress" messages.
    -c, --csv-friendly
        Use semicolon (;) instead of space to separate output columns.
    -h, --help
        Show this help.

Note:
    Program bpm-tag (on whis is this script based) is looking only for lowercase
    file extensions. If you get 0 (zero) BPM, this should be the case. So just
    rename the file.

License:
    GPL V2

Links:
    bpm-tools (http://www.pogo.org.uk/~mark/bpm-tools/)

Dependencies:
    bpm-tag mid3v2 vorbiscomment metaflac

Author:
    Martin Lukeš (martin.meridius@gmail.com)
    Based on work of kolypto (http://superuser.com/a/129157/137326)
    '
}

# Usage: result=$(inArray $needle haystack[@])
# @param string needle
# @param array haystack
# @returns int (1 = NOT / 0 = IS) in array
function inArray() {
    needle="$1"
    haystack=("${!2}")
    out=1
    for e in "${haystack[@]}" ; do
        if [[ "$e" = "$needle" ]] ; then
            out=0
            break
        fi
    done
    echo $out
}

# Usage: result=$(implode $separator array[@])
# @param char separator
# @param array array to implode
# @returns string separated array elements
function implode() {
    separator="$1"
    array=("${!2}")
    IFSORIG=$IFS
    IFS="$separator"
    echo "${array[*]}"
    IFS=$IFSORIG
}

# @param string file
# @returns int BPM value
function getBpm() {
    local file="$1"
    local ext="${file##*.}"
    declare -l ext # convert to lowercase
    { case "$ext" in
        'mp3')  mid3v2 -l "$file" ;;
        'ogg')  vorbiscomment -l "$file" ;;
        'flac') metaflac --export-tags-to=- "$file" ;;
    esac ; } | fgrep 'BPM=' -a | cut -d'=' -f2
}

# @param string file
# @param int BPM value
function setBpm() {
    local file="$1"
    local bpm="${2%%.*}"
    local ext="${file##*.}"
    declare -l ext # convert to lowercase
    case "$ext" in
        'mp3')  mid3v2 --TBPM "$bpm" "$file" ;;
        'ogg')  vorbiscomment -a -t "BPM=$bpm" "$file" ;;
        'flac') metaflac --set-tag="BPM=$bpm" "$file"
            mid3v2 --TBPM "$bpm" "$file" # Need to store to ID3 as well :(
        ;;
    esac
}

# # @param string file
# # @returns int BPM value
function computeBpm() {
    local file="$1"
    local m_opt=""
    [ ! -z "$m" ] && m_opt="-m $m"
    local x_opt=""
    [ ! -z "$x" ] && x_opt="-x $x"
    local row=$(bpm-tag -fn $m_opt $x_opt "$file" 2>&1 | fgrep "$file")
    echo $(echo "$row" \
        | gsed -r 's/.+ ([0-9]+\.[0-9]{3}) BPM/\1/' \
        | gawk '{printf("%.0f\n", $1)}')
}

# @param string file
# @param int file number
# @param int BPM from file list given by --import option
function oneThread() {
    local file="$1"
    local filenumber="$2"
    local bpm_hard="$3"
    local bpm_old=$(getBpm "$file")
    [ -z "$bpm_old" ] && bpm_old="NONE"
    if [ "$e" ] ; then # only show existing
        myEcho "$filenumber/$NUMFILES${SEP}$bpm_old${SEP}$file"
    else # compute new one
        if [ "$bpm_hard" ] ; then
            local bpm_new="$bpm_hard"
        else
            local bpm_new=$(computeBpm "$file")
        fi
        [ "$w" ] && { # write new one
            if [[ ! ( ("$bpm_old" != "NONE") && ( -z "$f" ) ) ]] ; then
                setBpm "$file" "$bpm_new"
            else
                [ "$v" ] && myEcho "Non-empty old BPM value, skipping ..."
            fi
        }
        myEcho "$filenumber/$NUMFILES${SEP}$bpm_old${SEP}$bpm_new${SEP}$file"
    fi
}

function myEcho() {
    [ "$o" ] && echo -e "$1" >> "$o"
    echo -e "$1"
}


# ================================== OPTIONS ==================================

eval set -- $(/usr/local/Cellar/gnu-getopt/1.1.6/bin/getopt -n $0 -o "-i:n:o:l:t:ewfm:x:vch" \
    -l "import:,input:,output:,list-save:,type:,existing-only,write,force,min:,max:,verbose,csv-friendly,help" -- "$@")

declare i n o l t e w f m x v c h
declare -a INPUTFILES
declare -a INPUTTYPES
while [ $# -gt 0 ] ; do
    case "$1" in
        -i|--import)                shift ; i="$1" ; shift ;;
        -n|--input)                 shift ; n="$1" ; shift ;;
        -o|--output)                shift ; o="$1" ; shift ;;
        -l|--list-save)         shift ; l="$1" ; shift ;;
        -t|--type)                  shift ; INPUTTYPES=("${INPUTTYPES[@]}" "$1") ; shift ;;
        -e|--existing-only) e=1 ; shift ;;
        -w|--write)                 w=1 ; shift ;;
        -f|--force)                 f=1 ; shift ;;
        -m|--min)                       shift ; m="$1" ; shift ;;
        -x|--max)                       shift ; x="$1" ; shift ;;
        -v|--verbose)               v=1 ; shift ;;
        -c|--csv-friendly)  c=1 ; shift ;;
        -h|--help)                  h=1 ; shift ;;
        --)                                 shift ;;
        -*)                                 echo "bad option '$1'" ; exit 1 ;; #FIXME why this exit isn't fired?
        *)                                  INPUTFILES=("${INPUTFILES[@]}" "$1") ; shift ;;
    esac
done


# ================================= DEFAULTS ==================================

#NOTE Remove what requisities you don't need but don't try to use them after!
#         always  mp3/flac     ogg       flac
REQUIRES="bpm-tag mid3v2 vorbiscomment metaflac"
which $REQUIRES > /dev/null || { myEcho "These binaries are required: $REQUIRES" >&2 ; exit 1; }

[ "$h" ] && {
    help
    exit 0
}

[[ $m && $x && ( $m -ge $x ) ]] && {
    myEcho "Minimal BPM can't be bigger than NOR same as maximal BPM!"
    exit 1
}
[[ "$i" && "$n" ]] && {
    echo "You cannot specify both -i and -n options!"
    exit 1
}
[[ "$i" && ( "$m" || "$x" ) ]] && {
    echo "You cannot use -m nor -x option with -i option!"
    exit 1
}
[ "$e" ] && {
    [[ "$w" || "$f" ]] && {
        echo "With -e option you don't have any value to write!"
        exit 1
    }
    [[ "$m" || "$x" ]] && {
        echo "With -e option you don't have any value to count!"
        exit 1
    }
}

for file in "$o" "$l" ; do
    if [ -f "$file" ] ; then
        while true ; do
            read -n1 -p "Do you want to overwrite existing file ${file}? (Y/n): " key
            case "$key" in
                y|Y|"") echo "" > "$file" ; break ;;
                n|N)        exit 0 ;;
            esac
            echo ""
        done
        echo ""
    fi
done

[ ${#INPUTTYPES} -eq 0 ] && INPUTTYPES=("mp3")

# NUMCPU="$(ggrep ^processor /proc/cpuinfo | wc -l)"
NUMCPU="$(sysctl -a | ggrep machdep.cpu.core_count | gsed -r 's/(.*)([0-9]+)(.*)/\2/')"
LASTPID=0
TYPESALLOWED=("mp3" "ogg" "flac")
# declare -A BPMIMPORT # array of BPMs from --import file, keys are file names
declare -A BPMIMPORT # array of BPMs from --import file, keys are file names

for type in "${INPUTTYPES[@]}" ; do
    [[ $(inArray $type TYPESALLOWED[@]) -eq 1 ]] && {
        myEcho "Filetype $type is not one of allowed types (${TYPESALLOWED[@]})!"
        exit 1
    }
done

### here are three ways how to pass files to the script...
if [ "$i" ] ; then # just parse given file list and set BPM to listed files
    if [ -f "$i" ] ; then
        # myEcho "Setting BPM tags from given file ..."
        while read row ; do
            bpm="${row%%;*}"
            file="${row#*;}"
            ext="${file##*.}"
            ext="${ext,,}" # convert to lowercase
            if [ -f "$file" ] ; then
                if [ $(inArray $ext INPUTTYPES[@]) -eq 0 ] ; then
                    FILES=("${FILES[@]}" "$file")
                    BPMIMPORT["$file"]="$bpm"
                else
                    myEcho "Skipping file on row $rownumber (unwanted filetype $ext) ... $file"
                fi
            else
                myEcho "Skipping non-existing file $file"
            fi
        done < "$i"
    else
        myEcho "Given import file does not exists!"
        exit 1
    fi
elif [ "$n" ] ; then # get files from file list
    if [ -f "$n" ] ; then
        rownumber=1
        while read file ; do
            if [ -f "$file" ] ; then
                ext="${file##*.}"
                ext="${ext,,}" # convert to lowercase
                if [ $(inArray $ext INPUTTYPES[@]) -eq 0 ] ; then
                    FILES=("${FILES[@]}" "$file")
                else
                    myEcho "Skipping file on row $rownumber (unwanted filetype $ext) ... $file"
                fi
            else
                myEcho "Skipping file on row $rownumber (non-existing) ... $file"
            fi
            let rownumber++
        done < "$n"
        unset rownumber
    else
        myEcho "Given input file $n does not exists!"
        exit 1
    fi
else # get files from given parameters
    [ ${#INPUTFILES[@]} -eq 0 ] && INPUTFILES=`pwd`
    for file in "${INPUTFILES[@]}" ; do
        [ ! -e "$file" ] && {
            myEcho "File or directory $file does not exist!"
            exit 1
        }
    done
    impl_types=`implode "|" INPUTTYPES[@]`
    while read file ; do
        echo -ne "Creating list of files ... (${#FILES[@]}) ${file}\033[0K"\\r
        FILES=("${FILES[@]}" "$file")
    done < <(gfind "${INPUTFILES[@]}" -type f -regextype posix-awk -iregex ".*\.($impl_types)")
    echo -e "Counted ${#FILES[@]} files\033[0K"\\r
fi

[ "$l" ] && printf '%s\n' "${FILES[@]}" > "$l"

NUMFILES=${#FILES[@]}
FILENUMBER=1

[ $NUMFILES -eq 0 ] && {
    myEcho "There are no ${INPUTTYPES[@]} files in given files/paths."
    exit 1
}

declare SEP=" "
[ "$c" ] && SEP=";"


# =============================== MAIN SECTION ================================

if [ "$e" ] ; then # what heading to show
    myEcho "num${SEP}old${SEP}filename"
else
    myEcho "num${SEP}old${SEP}new${SEP}filename"
fi

for file in "${FILES[@]}" ; do
    [ `jobs -p | wc -l` -ge $NUMCPU ] && wait
    [ "$v" ] && myEcho "Parsing (${FILENUMBER}/${NUMFILES})\t$file ..."
    oneThread "$file" "$FILENUMBER" "${BPMIMPORT[$file]}" &
    LASTPID="$!"
    let FILENUMBER++
done

[ "$v" ] && myEcho "Waiting for last process ..."
wait $LASTPID
[ "$v" ] && myEcho \\n"DONE"

Grazie per il tuo duro lavoro @kolypto e @meridius.

... il dolore che provo per mantenere un flusso di lavoro CLI e non pagare soldi per strumenti musicali ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.