파일로 출력한 다음 파일을 입력으로 사용

파일로 출력한 다음 파일을 입력으로 사용

더 짧게 쓰는 방법이 있나요? 기본적으로 명령을 파일로 출력한 후 해당 파일을 다음 명령의 입력으로 사용합니다. 나중에 볼 수 있도록 파일을 보관하고 싶습니다.

cmd1 > verylong.txt; cmd2 < verylong.txt

나도 할 수 있다는 걸 알아

cmd1 | tee verylong.txt | cmd2

그러나 "verylong.txt"는 거대한 파일이 될 것으로 예상하므로 파이프를 사용하면 전체 파일을 메모리에 보관하므로 효율성이 떨어질 것이라고 생각합니다. 반면 파일 입력을 사용하면 한 번에 한 줄씩 처리됩니다. (아니면 제 추측이 틀렸나요?)

이렇게 우아한 일을 할 수 있다면 참 좋을 것 같아요

cmd1 > verylong.txt > cmd2

답변1

제가 아는 한, cmd1 | tee verylong.txt | cmd2파일 전체가 메모리에 저장되지 않습니다. 실제로 cmd2입력을 소비하기 전에 너무 오래 기다리면 cmd1호출을 차단 write하고 cmd2다시 읽기 시작할 때만 잠금 해제될 수 있습니다.

그 이유는 파이프에 기본적으로 버퍼가 있기 때문입니다.특정 합리적인 크기로 제한됨.

물론 명령이 출력을 쓰기 전에 전체 입력을 읽어야 하는 경우(또는 유사한 경우) 상황은 cmd2다를 수 있습니다 sort. 이 경우 전체 파일 내용이 cmd2메모리에 유지될 수 있지만 이는 명령에 대한 입력으로 파이프 또는 중간 파일이 사용되는지 여부와 무관합니다.

답변2

이미 주어진 대답은 정확합니다. 그러나 목표가 verylongfile.txtw/를 선택적으로 읽는 cmd2것이라면 sed다른 옵션이 있을 수 있습니다.

cmd1 | sed -e 'w verylongfile.txt' -e '/notinteresting/d' | cmd2

sed모든 입력을 출력 파일에 기록하지만 w파이프 주소와 일치하지 않는 비트만 기록합니다. 또는 파이프 주소와 일치하는 행만 작성 /notinteresting/하는 작업을 무효화할 수도 있습니다 ./interesting/!dinteresting

이것이 목표가 아니라면 tee대신 사용하세요. 모든 입력을 출력 파일과 파이프에 쓰는 더 효율적인 도구입니다.

답변3

티와 서브쉘에 대한 깔끔한 트릭이 있습니다.

cat source.lst | tee >(doSomething.sh) >(somethingElse.sh) | somethingFinal.sh

나는 전에 이것을 해본 적이 있습니다.

pv -perl source.list | tee >(doSomething.sh) >(somethingElse.sh) | md5sum

pv진행률 표시줄, 예상 도착 시간, 운행 중인 총 경로 수가 표시됩니다. 그런 다음 source.lst는 doSomething.sh 및 someElse.sh(및 다른 CPU에 있음)에 공급됩니다. 마지막으로 학문적 목적으로 해당 큰 파일의 md5sum을 가져옵니다.

답변4

간단한 두 줄 배치 파일에 어떤 문제가 있나요? 좋다:

Cmd1 >filespec
Cmd2 <filespec

또는

cmd1 >filespec
cmd2 filespec

어느 쪽이든 파일은 대용량 저장소에 남아 있습니다.

관련 정보