본문 바로가기
C.W.K.
Stream
Lesson 10 of 10 · published

xargs와 tee

~12 min · xargs, tee, parallel

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

xargs로 표준 입력을 명령 인자로 바꾸기

rm, mvgit add 같은 명령은 파일명을 표준 입력이 아니라 인자로 받아. xargs는 표준 입력을 항목으로 나눠 다음 명령의 인자 목록으로 전달해.

알아야 할 플래그

  • -n 1은 한 번 실행할 때 인자를 하나씩 넘겨.
  • -I {}는 입력 항목을 {} 자리에 넣어 인자 위치를 정할 수 있게 해.
  • -0은 NUL로 구분된 입력을 읽으므로 find -print0와 함께 쓰면 공백과 줄바꿈이 든 파일명도 보존해.
  • -P 4는 최대 네 작업을 병렬로 실행해.
  • -r은 GNU 구현에서 입력이 비었을 때 명령 실행을 건너뛰어. macOS의 BSD 구현은 기본적으로 같은 동작을 해.

tee: 스트림 분기

tee는 표준 입력을 표준 출력과 하나 이상의 파일에 동시에 써. 결과를 화면에서 보면서 파일에도 남기고 싶을 때 사용해.

  • cmd | tee out.log는 화면에 출력하면서 파일에도 저장해.
  • cmd | tee -a out.log는 기존 파일의 뒤에 출력을 덧붙여.
  • cmd | sudo tee /etc/protected.conf는 파이프라인 결과를 관리자 권한이 필요한 파일에 쓸 때 사용하는 형태야.

합쳐서

find . -name '*.log' | xargs gzip은 찾은 로그를 압축해. 파일명 경계를 지키면서 병렬 처리하려면 find . -name '*.log' -print0 | xargs -0 -I {} -P 4 gzip {}처럼 써. ./build.sh | tee build.log | grep -i error는 전체 출력을 저장하면서 오류가 든 줄만 화면에 보여 줘.

파일명을 넘길 때는 NUL 경계를 써

줄바꿈으로 구분한 xargs 입력은 공백, 따옴표, 줄바꿈이 든 이름에서 깨질 수 있어. 파일 목록은 생산자가 -print0, 소비자가 -0를 지원하는 조합으로 넘겨. 사람이 만든 단순 단어 목록과 임의의 경로를 구분해야 해.

tee 뒤의 성공만 보지 마

파이프라인 중간에 tee를 넣으면 화면과 파일을 함께 얻지만 앞 단계나 파일 쓰기 실패가 최종 상태에서 가려질 수 있어. 파이프라인 각 단계와 목적지의 오류를 따로 확인하고, 중요한 산출물은 임시 파일에 완전히 쓴 뒤 교체해.

Code

Find + delete 안전하게·bash
# 먼저 대상을 출력해 확인
find . -name '*.tmp' -print
# 파일명 경계를 지키며 xargs로 삭제
find . -name '*.tmp' -print0 | xargs -0 rm -v
빌드 출력 저장 + 모니터링·bash
./build.sh 2>&1 | tee build.log | grep -i 'error\|warning'
# 기존 로그 뒤에 덧붙이기
make test 2>&1 | tee -a test.log

External links

Exercise

시험 디렉터리에 이름이 단순한 .tmp 파일과 공백이 든 .tmp 파일을 만들어. find ... -print0 | xargs -0 조합으로 이름 경계를 보존하는지 먼저 출력으로 확인한 뒤에만 파일을 지워. 마지막에는 seq 5 | tee count.log로 화면과 파일에 같은 데이터가 기록되는지 검증해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.