HylaFax는 스풀 폴더에 약 일주일 분량의 팩스 전송 기록을 보관합니다. 파일을 반복하고 사용자 및 페이지 수를 추출하여 로그에 출력하는 스크립트가 있습니다.
로그 파일에 중복 출력을 발생시키지 않고 처리된 파일을 이동/변경하지 않고 매일 폴더의 파일을 처리하는 가장 효율적인 방법은 무엇입니까?
폴더 설명:
# ls /var/spool/hylafax/doneq/
q10000 q10001 ... q10010
스크립트
#!/bin/bash
for i in /var/spool/hylafax/doneq/q*
do
user=$(cat $i | grep "mailaddr" | sed 's/mailaddr://g')
pgs=$(cat $i | grep "npages" | sed 's/npages://g')
echo "$i $user - $pgs pages" >> /scripts/log_output.txt
done
답변1
물어
로그 파일에 중복 출력을 발생시키지 않고 처리된 파일을 이동/변경하지 않고 매일 폴더의 파일을 처리하는 가장 효율적인 방법은 무엇입니까?
이를 달성하는 한 가지 방법은 처리된 파일의 정렬된 목록을 저장하는 것입니다. comm
후보 파일 목록 으로 처리하면 중복 항목이 제거됩니다.
기술의 예시로서 다음과 같은 것이 올바른 형식의 파일 이름(예: HylaFax에서 생성된 이름)을 처리하기 위한 기초로 사용될 수 있습니다.
find * -print | sort > /tmp/current_files
test -f /tmp/previous_files || { echo "Come back tomorrow"; exit 0; }
comm -13 /tmp/previous_files /tmp/current_files > /tmp/new_files
# ... Process entries in /tmp/new_files ...
mv -f /tmp/current_files /tmp/previous_files
답변2
이것은 덜 우아한 해결책일 수도 있지만 이것이 제가 생각해낸 것입니다:
#!/bin/bash
processed=$(cat /scripts/processed_log.txt)
for i in /var/spool/hylafax/doneq/q*
do
case "${processed[@]}" in
*"$i"*) ;;
*) echo "New! Going to add $i to the log"
echo $i >> /scripts/processed_log.txt
user=$(cat $i | grep "mailaddr" | sed 's/mailaddr://g')
pgs=$(cat $i | grep "npages" | sed 's/npages://g')
echo "$i $user - $pgs pages" >> /scripts/log_output.txt
;;
esac
done
스풀 디렉터리에 더 이상 존재하지 않는 process_log.txt의 파일을 삭제하는 논리를 추가하면 됩니다. sed는 이 문제를 훌륭하게 해결해야 합니다.