파일을“cat and follow”하는 방법은 무엇입니까?


31

에 의해 파일이 순차적으로 다운로드되고 wget있습니다.

로 포장을 풀기 시작하면 cat myfile.tar.bz2 | tar -xj더 빠른 내용에 따라 올바르게 포장이 풀리거나 "예기치 않은 EOF"가 표시되지 않을 수 있습니다.

파일을 "cat and follow"하는 방법, 즉 파일의 내용을 stdout으로 출력하지만 EOF에서 종료하지 말고 대신 해당 파일에 서브 스크립 브 된 상태로 유지하고 데이터의 새로운 부분을 계속 출력하여 파일이 닫혀있는 경우에만 종료 N 초 내에 다시 열지 않았습니다.


@arielCo의 답변 을 기반으로 cat_and_follow 스크립트 를 작성하여 더 이상 파일을 쓰기 위해 파일을 열지 않을 때 종료합니다 .tail


2
tailfollow 옵션 을 사용하여 명령을 찾고 있다고 생각합니다 .
keshlam

tail이진 파일과 함께 작동합니까?
Vi.

2
당신은 또한 같은 수도 less +F...
mikeserv

나는 당신이 당신의 해결책을 찾았다는 것을 알고 있지만, 왜 그렇게하지 않는지 궁금합니다.wget ... && tar xjvf ...
Joseph R.

@JosephR., 1. 병렬화하여 시간을 절약합니다. 2. 시스템 부하를 균일하게하기 위해 (자원 집약적 전체 스로틀 포장 풀기 단계 방지 / 최소화); 3. "unpack"명령에 대한 추억 (또는 예약) 또는 처음에 체인 명령 입력을 피하기 위해 (아직 압축을 풀고 싶지 않은 경우)
Vi.

답변:


22
tail +1f file

wget다운로드하는 동안 LibreOffice 소스 tarball을 사용하여 Ubuntu에서 테스트 했습니다.

tail +1f libreoffice-4.2.5.2.tar.xz | tar -tvJf -

또한 내 Android 전화의 tail +1 -f fileBusybox와 함께 사용되는 Solaris 10, RHEL3, AIX 5 및 Busybox 1.22.1에서도 작동합니다 .


1
다운로드가 완료되면 자동으로 종료됩니까? "팔로어"가 /proc/*/fd/주기적으로 스캔 하고 파일이 제대로 닫혀 있는지 확인해야합니다.
Vi.

2
나는 tail그것이 binray 파일과 함께 작동하는 것을 기대하지 않았다
.

/proc/../fd 스캔 및 자동 종료를 수행하는 스크립트를 작성했습니다.
Vi.

1
GNU tail이 필요하지 않습니다 -f. 옵션이 표준 이라고 생각합니다 . 그러나 다운로드가 완료되면 자동으로 종료되지 않습니다.
Barmar

4
우분투 tail +1f에서는 작동하지 않습니다. 당신은해야합니다tail -n +1
dangonfast

11

문제는 cat파일이 여전히 추가되고 있다는 것을 인식하지 못한다 는 것 입니다. cat파일의 (현재) 끝이 발생 하자마자 종료됩니다.

당신은 확인해야합니다 wget이를 방지하기 위해 파이프 (또는 FIFO)에 쓰기.

wget -O - http://... | tar -xjf -

7
또는 curl기본적으로 stdout으로 출력됩니다. (1) -f -은 중복 tar되어 기본적으로 stdin 에서 읽으며 (2) 대부분 tar의 경우 압축을 자동으로 감지 할 수 있으므로 j종종 불필요합니다. curl http://... | tar x
Kevin

2
압축이 풀린 파일을 저장하지 않고 다운로드합니다. 또한 네트워크 상태가 좋지 않은 경우 다운로드를 계속하지 못하게됩니다.
Vi.

3
@Vi. 다음 tee과 같이 사용하여 파일을 저장할 수 curl http://… | tee ….tbz | tar -xj있지만 다운로드를 다시 시작하면 동일한 명령을 다시 호출하는 것보다 복잡합니다.
kasperd 2016 년

5

처음부터 중단 될 때까지 파일 을 읽고 따르 려면 :

tail -fn +1 file

이를 증명하려면 다음을 시도하십시오 (GNU Coreutils를 사용하는 Bash 가정).

(while true; do printf . >> /tmp/file; sleep 1; done)&
tail -fn +1 /tmp/file  # (Ctrl-C to interrupt, of course, or otherwise kill it.)
kill %  # Kills the while-loop.

(참고 : +1f다른 사람들이 언급 한 것은 최소한 GNU tail명령 에서 파일 이름으로 해석됩니다 .)

위의 내용은 단일 파일에 적용됩니다. 여러 파일을 연결하면 첫 번째 파일에 매달리지 않고 결정적으로 모든 파일을 따를 수 없습니다. ' cat and follow '에 마지막 파일 만 따라 가면 프로세스 대체를 사용할 수 있습니다 . 또 다른 데모는 다음과 같습니다.

printf file1 > /tmp/file1; printf file2 > /tmp/file2
(while true; do printf . | tee -a /tmp/file{1,2} > /dev/null; sleep 1; done)&
cat /tmp/file1 <(tail -fn +1 /tmp/file2)  # (Interrupt or kill it.)
kill %  # Kills the while-loop.

tail +1f file그렇지 않은 동안 이것은 나를 위해 일했습니다 .
therealfarfetch 님이

이 답변은 tail +1f다음과 같은 다른 옵션과 결합 할 때보 다 훨씬 좋습니다.--pid
Joseph K. Strauss
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.