![최신 파일의 마지막 몇 줄을 볼 수 있도록 디렉터리의 파일을 연속적으로 연결하려면 어떻게 해야 합니까?](https://linux55.com/image/188923/%EC%B5%9C%EC%8B%A0%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%A7%88%EC%A7%80%EB%A7%89%20%EB%AA%87%20%EC%A4%84%EC%9D%84%20%EB%B3%BC%20%EC%88%98%20%EC%9E%88%EB%8F%84%EB%A1%9D%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%97%B0%EC%86%8D%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%97%B0%EA%B2%B0%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
Twitter를 듣고 특정 키워드가 포함된 트윗을 JSON 파일에 저장하는 스크립트가 있습니다. 스크립트가 시작될 때마다 새로운 대상 파일이 생성됩니다.
때때로 내 스크립트가 충돌하고 자동으로 다시 시작되어 프로세스에서 새 JSON 파일이 생성됩니다.
들어오는 트윗의 실행 로그를 표시하고 싶습니다. 단일 파일을 사용하여 다음을 수행할 수 있습니다( jq
JSON에서 단일 필드만 표시 하도록 파이프 ).
tail -f file1.json | jq '.text'
그러나 스크립트가 충돌하고 다시 시작되면 새 파일이 생성되고(예: file2.json
) 위 명령은 더 이상 업데이트되지 않는 파일을 수신합니다.
이 문제를 해결하려면 디렉터리에 있는 모든 파일과 tail -f | jq '.text'
결과를 연결해야 한다고 생각했습니다.
그러나 나는 비록할수있다cat *
현재 폴더에 있는 모든 파일을 연결하려면 새 파일이 자동으로 연결에 추가되지 않는 것 같습니다.
항상 최신 파일의 최신 행을 볼 수 있도록 폴더의 모든 파일을 연속적으로 연결하려면 어떻게 해야 합니까?
답변1
이 솔루션은 이식성이 없는 tail -F
(예:) 것을 사용합니다. tail --follow=name --retry
테스트에는 GNU를 사용하십시오 tail
.
다음과 같이 진행해주세요:
monitored
일반 파일로 생성 :: >>monitored
file*.json
주기적으로 파일이 있는지 확인하십시오monitored
. 그렇다면monitored
파일에 대한 하드 링크로 바꾸십시오.while sleep 1; do find . \( -name . -o -prune \) -name 'file*.json' -newer monitored -exec ln -f {} monitored \; done
위의 루프는 백그라운드에서 실행될 수 있습니다.
monitored
이름으로 모니터링:tail -F monitored
jq '.text'
파이프 나 다른 수단을 통해 수행할 수 있습니다 .
노트:
귀하의 명확한 질문은 다음과 같습니다
항상 최신 파일의 최신 행을 볼 수 있도록 폴더의 모든 파일을 연속적으로 연결하려면 어떻게 해야 합니까?
내 솔루션이 "지속적으로 연결"되지 않습니다. 그러나 "최신 파일의 최신 행을 볼 수 있습니다".
같은 초에 많은 파일이 생성/업데이트되는 경우 각 파일이 한 순간만 표시된다는
file*.json
보장이 없으며 일부 파일은 건너뛸 수 있습니다.monitored
그러나 귀하의 스크립트가 때때로 충돌하고 자동으로 다시 시작되므로 한 번 다시 시작할 때부터 다음 번 다시 시작할 때까지 1초 이상 걸릴 수 있다는 점을 이해합니다. 그러면 문제가 없습니다.일반적으로 문제가 발생할 수 있습니다. "최신 파일" 상태가 한 파일에서 다른 파일로 너무 자주 이동하는 경우 이 솔루션이 완전히 신뢰할 수 없다는 점을 분명히 했습니다.
답변2
현재 디렉토리의 모든 파일을 보려면 다음 구조를 사용하십시오.
ls | cat - <(inotifywait -m --format '%f' -e create . ) | while read file ; do tail -v -f "$file" & done
참고하시기 바랍니다확실히감시 디렉터리에 하위 디렉터리를 포함하는 기능을 지원합니다.