2016-09-12 2 views
1

서버 메일 폴더에서 NAS 장치로 파일을 다운로드하는 쉘 스크립트가있어 클라이언트가 백업본을 사용하여 로컬로 복사본을 만들었습니다.이메일 제목을 bash를 통해 파일에서 가져옵니다.

파일은 11469448248.H15587P19346.smtp.x14.eu_2, S 개의 파일로 저장됩니다. 전자 메일 클라이언트가 디스크에서 읽을 수 있도록 표준 .eml 형식으로 확장되었습니다.

for f in *.smtp.x14.eu_2,S; do 
#sed "9q;d" $f 
#tail -n+9 $f | head -n1 
mv -- "$f" "${f%.smtp.x14.eu_2,S}.eml"; 
done 

당신은 내가 파일에서 9 번째 라인을 얻을 수있는 나오지꼬리를 명령을 사용하려고했습니다 볼 수 있듯이, 문제는 피사체가 항상 9 번째 줄에 있지 않으며 파일 이름이 내용을별로 말해주지 않는다는 것입니다.

이해할 수있는 형식으로 파일 이름을 얻으려고하므로 주제가 도움이 될 수 있다고 생각했습니다. PD : 이메일 파일의 n 번째 줄에

주제로 시작하는 라인 주제

주제 제거하는이 라인 FET 찾기 위해 노력 : PD :을하고 나머지를 남겨 ne 파일 이름

+1

이 더 정확 해주십시오. 정확히하고 싶은게 뭐야? 찾고있는 것이 항상 9 번째 줄에있는 것이 아니라면 어떤 패턴을 찾아야합니다. –

+1

아마도 형식 정의에 대한 링크를 포함 시키거나 좋은 예를 들어 보셨을 것입니다. – Beta

+0

내가 달성하고자하는 결과 파일 이름을 포함하도록 질문을 편집했습니다. – adam

답변

2

다음은 입니다.입니다.하지만 묻고있는 것처럼 보입니다.

subj=$(sed -n '/^Subject: PD *//!d;p;q;/^$/q' "$f") 

이의 문제는 사소한 경우에 성공한다는 것입니다,하지만 당신은 MIME의 Subject: 헤더를 RFC2047로 인코딩, 그리고 (더 사소)를 Subject: 헤더는 한 줄 이상에 걸쳐 때 때 실패합니다.

나는 좀 더 현대적인 프로그래밍 언어로 이것을 접근 할 것이다. 꽤 단 하나의 라이너는 아니지만 파이썬으로는 쉽습니다. emailsubj.py이 더 많거나 적은

#!/usr/bin/env python 
from email.parser import Parser 
from email.header import Header, decode_header 
from sys import argv 

for filename in argv[1:]: 
    with open(filename, 'rb') as handle: # handle file not found etc? 
     message = Parser().parse(handle) 
    try: 
     subj = ''.join([frag.decode(enc) if enc else frag 
      for frag, enc in decode_header(message['subject'])]) 
    except HeaderParseError, UnicodeDecodeError: 
     subj = message['subject'] # maybe warn about error? 
    print(subj) 

같은 것을 포함

subj=$(./emailsubj.py "$f") 

는 (분명히, chmod +x emailsubj.py해야합니다.)

+0

Procmail 스위트의'formail'은 래핑 된 헤더를 처리하지만 RFC2047 인코딩에 대해서는 아무 것도하지 않습니다. – tripleee

+0

확인. 고마워. 나는 이것을 파이썬으로 할 것이다. (내 첫 번째 py 스크립트가 될 것이다.) – adam

+0

나는 그것을 파이썬 3으로 업그레이드해야만한다. 전자 메일을 바이트로 읽은 다음 인코딩이 정의 된 텍스트로 디코딩하는 것은 파이썬에서 이상한 일종입니다. 어쩌면 가장 간단한 해결책은'encoding = 'latin-1' '으로 가짜로 만든 다음 적절한 US-ASCII로 떨어 뜨리는 것입니다.그러나 그 동안이 Python 2 스 니펫은 잘 작동 할 것입니다. – tripleee

관련 문제