Linux için herhangi bir vuruş algılama yazılımı? [kapalı]


29

Amarok 2, ID3v2 etiketinin 'bpm' alanını kullanarak müzik koleksiyonunda arama yapabilir. Müzik koleksiyonunun tamamını yeniden adlandırmak çok hoş olurdu , böylelikle sevdiğim parçanın ruh halini bulabilirim.

Ancak, bana yardımcı olabilecek herhangi bir ritim algılama yazılımı bulamadım. Hiç kullandın mı? CLI, tercihen. Ayrıca FLAC'leri aynı 'bpm' alanıyla etiketlemek için benzer bir şey varsa ilgileniyorum.

Teşekkürler! :)

PS Güzel bir moodbar özelliği olduğunu biliyorum, ancak arama yapmak için faydasız.


3
bu sayfayı gördün mü mmartins.com/mmartins/bpmdetection/bpmdetection.asp Tam olarak aradığınızı düşünüyor.
DaveParillo

@DaveParillo "bir parça ruh hali" bağlantısı, sabit diskinize bir bağlantıdır ve sizden başkası için işe yaramaz
Justin Smith

: Smith @Justin, o BpmDj docs bir dosyayı :) İşte çevrimiçi versiyonu anlamına geliyordu bpmdj.yellowcouch.org/clustering.html
kolypto

@Justin - Üzgünüm - seğirme tetik parmak, sanırım.
DaveParillo

Yanıtlar:


17

DaveParillo sitesinde BpmDj projesini bulduğumu önerdi . bpmcountÇok güzel bpm hesaplayan bir yürütülebilir dosya var: flac'ın yanı sıra mp3 de işliyor:

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

Geride kalan tek şey koleksiyonun yeniden etiketlenmesi. Başarılı olduğumda bu cevabı güncelleyeceğim. Teşekkürler! :)


Aşama 1

bpmcountKoleksiyonun tamamına karşı koşun ve sonuçları bir metin dosyasına kaydedin. Sorun, bpmcountzaman zaman çöküyor ve birkaç dosyayı işlerken 2GB'a kadar bellek yemeye çalışıyor, bu yüzden dosya isimleriyle birer birer beslemeliyiz. Bunun gibi:

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

Adım 2

Biz bazı ek paketler gerekir: apt-get install vorbis-tools flac python-mutagen. Şimdi 'bpm' etiketinin nasıl eklenebileceğine bir göz atın:

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

Ne yazık ki, hiç * .ape izim yok

Şimdi BPM'lerimiz var ve koleksiyonun tamamı yeniden etiketlenmeli. İşte senaryo:

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

Adım 2.1 Yenilendi İşte koleksiyonunuza BPM etiketleri ekleyen bir betik.

İşlemi daha hızlı yapmak için CPU Çekirdeği başına bir işlem gerçekleştirir. Ek olarak, geçici dosya kullanmaz ve bir dosyanın zaten etiketlenip etiketlenmediğini tespit edebilir.

Ek olarak, FLAC’in bazen hem ID3 hem de VorbisComment içerdiğini keşfettim. Bu komut dosyası her ikisini de günceller.

#!/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

Keyfini çıkarın! :)


Mükemmel! Bunu dün gece denemek için uğraşmadım. Komut satırı etiketlemesine gelince , en az Ex Falso komut satırı düzenlemesini destekleyene kadar servis verilebilir mid3v2: linux.die.net/man/1/mid3v2 adresini deneyin . TBPM
İd3v2

1
Teşekkürler, birkaç gün içinde deneyeceğim ve sonuçları göndereceğim :) FLAC'ın böyle bir şeyi destekleyip desteklemediğini merak ediyorum: Bunu kontrol etmek zorunda kalacağım.
kolypto

1
2. adımda iyi iş çıkardınız. Keşke iki kez oy alabilsem!
DaveParillo

1
Teşekkürler :) Ne yazık ki, Amarok'um FLAC'lerde yeni etiketi fark etmedi, en çok sevdiğim :)) hata gönderildi.
kolypto

Nasıl kurdun? Sağladıkları rpm bilgisayarımda çalışmıyor gibi görünüyor ve derleme ile mücadele ediyorum.
pedrosaurio


6

Kullandığım kolypto orijinal senaryo kullanılan bpmcountve bunu yeniden yazdı bpm-tag(yararlılığı bpm-toolsı yüklerken daha şanslı vardı). Ben de kendim için bazı iyileştirmeler yaptım.

GitHub https://github.com/meridius/bpmwrap adresinde bulabilirsiniz.


Bu, bir Mac üzerinde çalışmak için birkaç değişikliğe ihtiyaç duyuyordu, ki aşağıda kendi cevabımı ekledim (yorum için çok uzun olduğu için)
Adrian

2

Tam olarak aradığınızı yapan bir araç bilmiyorum, ancak MusicIP ile uğraştım .

Linux / java sürümünü kullandı - bir müzik kitaplığını tamamen analiz etmek uzun zaman alıyor ancak gerçekten çalışıyor. Diğer şarkılara benzer şarkıları bulabilirsiniz. Oluşturulan çalma listesine sağ tıklayabilir ve seçilenler gibi daha fazla veya daha az şarkı seçmek için seçenek seçebilirsiniz. Ayrıca belirli türlerin ortadan kaldırılmasını da seçebilirsiniz. Biraz havalı, ama vay faktörü aşındıktan sonra kullanmayı bıraktım.

Ücretsiz sürüm (en az) m3u biçiminde 75 şarkıya kadar şarkı listelerini dışa aktarır.

Şu anda desteklenmiyor, ancak Predexis olarak ticari almaya çalıştıklarını düşünüyorum .


1

Sadece aradığınızı söylediğiniz bir araç olmamakla birlikte, Banshee medya oynatıcısı bpm'yi tespit edebilir.

Tüm müzik çalma, organizasyon ve taşınabilir oynatıcılarla senkronizasyon için Banshee'yi kullanıyorum. Bağlı değilim, ancak programı denediğim her şeyin en iyisini seviyorum. Ayrıca, bpm dahil, parçaların her türlü özelliğine dayalı olarak "akıllı çalma listeleri" oluşturabilir.

Şarkı hakkında her şeyi analiz eden ve çalmakta olan şarkıya benzer şarkıları bulabilecek bir uzantı var. Buna Mirage denir ve bir süre kullandım, fakat daha fazla kullanmıyorum, çünkü çeşitli ruh hallerine uyan çeşitli çalma listeleri oluşturdum (Mirage’ya göre kesinlikle benzer değil).

Banshee, tespit ettiği bpm'yi, dosyanın ID3v2 "bpm" etiketine kaydedecek mi bilmiyorum. Herkes bpm etiketini program dışından kolayca kontrol etmeyi bilirse, kontrol edeceğim.



0

MP3 dosyalarını doğru BPM değerine etiketlemek için başka bir araç buldum.

Buna BPMDetect denir . Açık kaynak. QT libs, Gnome altında gayet iyi çalışır. Bir GUI ile birlikte gelir, ancak yalnızca sürüm olarak derlenebilir (readme.txt dosyasında belirtildiği gibi "scons console = 1" komutunu çalıştırın).

Aksi halde, sonunda, BPMDetect'i 64 bitlik bir Ubuntu sunucusunda (fmodex bağımlılığı nedeniyle) derlemekte zorlandığım için, BpmDJ'den "bpmcount" u da kullandım. Bu yüzden yukarıdaki (çok güzel ve iyi yazılmış) kabuk betiğini aldım (aşağıya bakınız), BpmDJ web sitesinde bulunan [x64. Rpm] [3] 'ten çıkarılan "bpmcount" ikilisi (sadece .rpm'yi çıkardım) ile

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

ve bir cazibe gibi çalıştı. Sadece yukarıdaki betiği değiştirmek zorunda kalmıştım, kutudan çıktığımda yanımda değildi (bpmcount binary'in stdout / stderr'inde sorun vardı). Değişikliğim dosya yönlendirmesi ile ilgili:

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

0

Bu soruda stackoverflow'ta önerilen bir başka araç daha var : python modülleriyle birlikte gelen aubio .

Denemedim çünkü BpmDj'yi derlemekle çok meşguldüm . Sadece başkalarının çalışırken aynı sıkıntılarla karşılaştıklarını fark etmesi durumunda, kesinlikle emin olmanızı şiddetle tavsiye ederim:

  1. BpmDj kaynaklarının son sürümünü indirmiş olmak
  2. uygun yükseltme kütüphanelerinin kurulu olması

En yeni g ++ derleyici güncellemeleriyle, özellikle debian ve ubuntu sürümleriyle ilgili bazı sorunların ortaya çıktığı görülmektedir. Bu sorunların farkına vardığı anda, yazar ortaya çıkan uyumsuzlukları çözme ve bir çekicilik gibi derleyen yeni bir sürüm hazırlamanın nezaketine sahipti. Son zamanlarda acımasız derleme hataları yüzünden çaresizlik içinde olmaya yakın olan herkes: Şimdi kazanıyorsunuz.

@ mmx , aletleriniz de iyi görünüyor, ancak SoXvarsayılan olarak mp3 özelliği bulunmayan güveniyorlar . Bu yüzden, önce SoX'u Lame / MAD desteğiyle derlemeyi gerektiriyorlar, bu ne yazık ki benim için tembel olan insanlar için çok fazla çaba.


0

@Meridius'un Mac'imde çalışmasını sağlamak için bir parça ekstra ayak işi yapmak ve betiği biraz değiştirmek zorunda kaldım:

# 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 ..

Sonra her şeyin GNU versiyonlarına ve birkaç diğer ayarlara işaret etmek için senaryoyu değiştirmek zorunda kaldım:

#!/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"

@Kolypto ve @meridius sıkı çalışmanız için teşekkür ederiz.

... bir CLI iş akışını sürdürmek ve müzik aletleri için para ödememek için yaşadığım acı ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.