2010-11-24 5 views
1

인사말,이 bash 기능을 최적화 할 수 있습니까?

클라이언트에서받은 ZIP 파일을 구문 분석하고 기준 집합이 일치하면 압축을 풀 수있는 bash 스크립트가 있습니다. 그것은 잘 작동하지만 느립니다. 특히 다음 함수는 다음과 같습니다.

이 함수의 목적은 ZIP 파일에 포함 된 제어 파일의 이름을 가져 오는 것입니다. HDD_LIST_Array[@] 각 zip 파일에 대한 thusly 히 얻을 수있다 :

HDD_LIST_Array=(`unzip -l $name | head -n -2|tail -n +4 | sort -r | awk '{print $4}'`) 

을 다시, 천천히이기는하지만, 작동합니다. 이 기능을 더 빠르게 실행하도록 최적화 할 수 있습니까? 어떤 충고?

감사합니다.

+0

과 같이 차별화하려면 두 문자가 필요합니다. zip 파일의 압축 해제 출력 예는 1이고, 결과는 getCTLfile –

+0

입니다. 출력을 압축 해제 === >> CTCA_HDD_20101108_150000.ctl 029045871901 ~ 씨게이트 ~ 20,101,108 ~ 140021.HDD 028,919,111,311 ~ WD ~ ~ 140025.HDD 20101108 ... – Chris

+0

getCTLfile 출력 === >> 접미사입니다 : CTL. – Chris

답변

3

unzip -l은 입력 파일 이름 다음에 일치하는 파일 패턴을 취하고 파일 패턴을 찾으면 0을 반환하고 실패하면 11을 반환합니다.

entry=$(unzip -l -qq "$name" '*.ctl') 
if [ $? -eq 0 ] 
then 
    awk '{ print $4 }' <<< "$entry" 
done 
+0

와우. 귀하의 접근 방식은 나의 것보다 훨씬 효율적입니다 ... 귀하의 의견을 보내 주셔서 감사합니다. – Chris

+3

@Chris : AWK를 사용하지 않아도됩니다 : 첫 번째 줄을 'if entry = ($ (unzip -l -qq "$ name"'* .ctl '))'로 변경하고 두 번째 줄을 지우고 (이전의) 네 번째 줄을'printf "% s \ n"$ {entry [3]} "으로 변경하십시오. 조건문에서 과제를 만드는 것은 당황 스럽다. AWK 대신 배열을 사용하는 장점을 별도로 사용할 수도있다. –

+0

@Dennis : 나는 스스로 가르친다. 조건문에 과제를 배정하는 것이 싫은 이유를 설명해주십시오. – Chris

0

if 대신 awk&& 대신 cut을 사용할 수 있지만 그럴 가능성은 거의 없습니다. 너의 가장 큰 벽시계가 압축 해제에 대한 IO라고 생각 하겠지, 그렇지?

time 명령을 전체 호출과 함께 넣고 접두사를 unzip으로 지정하여 % 차이를 확인하십시오.

OTHERWISE : *.ctl으로 끝나는 모든 파일 (예 : head | tail)을 검색하고 인쇄하는 것처럼 보입니까? 압축 해제 출력에서 ​​grep 또는 sed 만 오갈 수 있습니까? 나는 unzip -l |awk 스크립트로 충분할 것이라고 내기하고 있습니다. 자세한 내용을 제공 할 때 답변을 업데이트하겠습니다.

+0

수정하십시오. 압축을 풀면 가장 많은 IO가 필요합니다 ... 대신 grep을 사용합니다. – Chris

0

mobrule의 답변을 보완하기위한 약간의 설명.

'-'는 원하지 않는 줄에 나타납니다. ':', 또는 egrep '- [0-9]'

관련 문제