bash에서 계속 증가하는 파일 목록을 반복하는 방법은 무엇입니까?

bash에서 계속 증가하는 파일 목록을 반복하는 방법은 무엇입니까?

각 파일의 이름이 이전 파일 뒤에 알파벳순으로 오는 파일 생성기가 실행 중입니다. 처음에 나는 비슷한 루프를 수행하고 있었지만 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감시 중인 디렉터리로 이동된 파일을 캡처하면 됩니다.

관련 정보