2014-10-08 7 views
1

나는 디렉토리를 통해 이동하고, MP3에서 ID3 정보를 추출하고, 태그 정보를 MySQL DB로 가져 오는 두 개의 Bash 스크립트가 있습니다. 실행을 끝내는 데는 꽤 시간이 걸리므로 누군가가 스크립트를 좀 더 효율적으로 만들 수있게되기를 바랍니다. 다음과 같이MySQL에서 가져 오기 속도를 높이는 Bash ID3

스크립트는 다음과 같습니다

:

makeid3dbentry.sh 다음 주 업데이트 스크립트에서 호출

INSERT INTO `music` (`artist`,`name`,`album`,`albumartist`,`filename`) VALUES ("1200 Micrograms","Ayahuasca","1200 Micrograms","1200 Micrograms","/mnt/sharedmedia/music/Albums/1200 Micrograms/1200 Micrograms [2002]/1-01 - 1200 Micrograms - Ayahuasca.mp3") ON DUPLICATE KEY UPDATE `artist`="1200 Micrograms",`name`="Ayahuasca",`album`="1200 Micrograms",`albumartist`="1200 Micrograms",`filename`="/mnt/sharedmedia/music/Albums/1200 Micrograms/1200 Micrograms [2002]/1-01 - 1200 Micrograms - Ayahuasca.mp3"; 

같은 INSERT 문을 생성

TRACK=$(id3info "$1" | grep '^=== TIT2' | sed -e 's/.*: //g') 
ARTIST=$(id3info "$1" | grep '^=== TPE1' | sed -e 's/.*: //g') 
ALBUM=$(id3info "$1" | grep '^=== TALB' | sed -e 's/.*: //g') 
ALBUMARTIST=$(id3info "$1" | grep '^=== TPE2' | sed -e 's/.*: //g') 

COLS='`artist`,`name`,`album`,`albumartist`,`filename`' 
# Replace all: ${string//substring/replacement} to escape " 
VALS='"'${ARTIST//\"/\\\"}'","'${TRACK//\"/\\\"}'","'${ALBUM//\"/\\\"}'","'${ALBUMARTIST//\"/\\\"}'","'${1}'"' 

SETLIST='`artist`="'${ARTIST//\"/\\\"}'",`name`="'${TRACK//\"/\\\"}'",`album`="'${ALBUM//\"/\\\"}'",`albumartist`="'${ALBUMARTIST//\"/\\\"}'",`filename`="'${1}'"' 

echo 'INSERT INTO `music` ('${COLS}') VALUES ('${VALS}') ON DUPLICATE KEY UPDATE '${SETLIST}';' 
exit 

updatemusicdb.sh

DIRFULLPATH="${1}" 
DIRECTORY=$(basename "${DIRFULLPATH}") 

SQLFILE="/var/www/html/scripts/sql/rebuilddb_${DIRECTORY}.sql" 
find "${DIRFULLPATH}" -type f -iname "*.mp3" -exec /var/www/html/scripts/bash/makeid3dbentry.sh {} > "${SQLFILE}" \; 
mysql --defaults-extra-file=/var/www/html/config/website.cnf --default-character-set=utf8 "website" < "${SQLFILE}" 

불행히도 Bash & 병목 현상이 어디에 있는지 그리고 이러한 스크립트를 개선하는 방법을 알기에 충분할만큼 Linux 환경을 잘 모릅니다. 스크립트를 개선하는 방법에 대한 조언이나 다른 방법이 더 좋거나 더 빨라지면 감사하겠습니다.

+1

모두 일치하는 태그를 참조하십시오. 출력 레코드의 기록은 1 awk 프로세스에서 수행 할 수 있습니다. 그것은 훨씬 더 빠를 것입니다. 행운을 빕니다. – shellter

답변

0

이미 의견에 제안 된대로 id3info 번을 여러 번 실행하지 않아도됩니다.

makeid3dbentry.sh은 코드 주위에 간단한 for file in "${@}"으로 여러 인수를 사용할 수 있습니다. 그런 다음 find-exec yourscript.sh {} + (xargs와 유사 함)으로 실행할 수 있습니다. 이렇게하면 스크립트 호출 횟수가 크게 줄어 듭니다. 하지만이 모든 것을 하나의 스크립트로 수행하는 것이 좋습니다. find 명령 (-exec 매개 변수없이)을 사용하여 for 루프에서 삽입 명령문 생성을 랩핑하고이 출력을 파일로 파이프 할 수 있습니다.

MySQL 데이터베이스가 InnoDB를 사용한다고 가정하면 MySQL은 작업이 완료 될 때까지 (모든 삽입 작업을 수행하는 대신) 데이터 커밋을 건너 뛰도록 MySQL에 지시하여 삽입 속도를 높일 수 있습니다. START TRANSACTION;을 SQLFILE의 맨 위에 삽입하고 하단의 COMMIT;을 삽입하십시오. http://dev.mysql.com/doc/refman/5.6/en/commit.html, http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

+0

늦게 받아 들여서 죄송합니다. 새로운 직장을 시작했고 이것은 혼돈 속에 길을 잃었습니다. 고맙습니다. –