각 파일의 이름이 이전 파일 뒤에 알파벳순으로 오는 파일 생성기가 실행 중입니다. 처음에 나는 비슷한 루프를 수행하고 있었지만 for file in /path/to/files*; do...
, glob은 루프 이전에만 확장되고 루프 중에 생성된 새 파일은 처리되지 않는다는 것을 빨리 깨달았습니다.
내 현재 접근 방식은 매우 추악합니다.
while :; do
doneFileCount=$(wc -l < /tmp/results.csv)
i=0
for file in *; do
if [[ $((doneFileCount>i)) = 1 ]]; then
i=$((i+1))
continue
else
process-file "$file" # prints single line to stdout
i=$((i+1))
fi
done | tee -a /tmp/results.csv
done
위에서 언급한 해킹 없이 계속 증가하는 파일 목록을 반복하는 쉬운 방법이 있습니까?
답변1
일반적인 접근 방식은 새 파일을 한 디렉터리에 표시하고 처리 후 이름을 바꾸거나 다른 디렉터리로 이동하여 동일한 디렉터리를 다시 만나지 않도록 하는 것입니다. 그래서 이런 것
cd new/
while true; do
for f in * ; do
process file "$f" move to "../processed/$f"
done
sleep 1 # just so that it doesn't busyloop
done
또는 유사하게 파일 확장자를 변경합니다.
while true; do
for f in *.new ; do
process file "$f" move to "${f%.new}.done"
done
sleep 1 # just so that it doesn't busyloop
done
Linux에서는 다음을 사용할 수도 있습니다.inotifywait
새 파일에 대한 알림을 받으세요.
inotifywait -q -m -e moved_to,close_write --format "%f" . | while read -r f ; do
process file "$f"
done
두 경우 모두 아직 기록 중인 파일을 모니터링해야 합니다. 내부에서 생성된 대용량 파일은 자동으로 표시되지 않지만 스크립트는 쓰기 중간에 처리를 시작할 수 있습니다.
위의 inotify 이벤트는 close_write
쓰기 프로세스에 의해 파일이 닫힐 때 파일을 볼 수 있지만(그러나 수정된 파일도 포착합니다), 이 create
이벤트는 파일이 처음 생성될 때 파일을 볼 것입니다(그러나 여전히 기록될 수 있습니다). moved_to
감시 중인 디렉터리로 이동된 파일을 캡처하면 됩니다.