우분투 실전 명령어 | xargs -P로 배치 작업 병렬 처리
언제 쓰는가
같은 형태의 작업을 파일 여러 개에 반복 적용할 때 xargs -P가 가장 빠르게 체감됩니다.
예를 들어 로그 200개를 gzip으로 압축하거나, 이미지 변환, 체크섬 계산처럼 파일 단위 작업을 한 번에 밀어 넣을 때 유용합니다.
단일 스레드로 오래 기다리기보다 CPU 코어를 적당히 써서 처리 시간을 줄이고 싶을 때 쓰면 좋습니다.
바로 쓰는 명령어
# 현재 폴더의 .log 파일을 4개씩 병렬 gzip 압축
find . -maxdepth 1 -type f -name '*.log' -print0 \
| xargs -0 -n1 -P4 gzip -9
# SHA256 체크섬을 8개 병렬 계산
find /data -type f -name '*.bin' -print0 \
| xargs -0 -n1 -P8 sha256sum > checksums.txt
# 파일명에 공백이 있어도 안전하게 처리하면서 변환 스크립트 실행
find ./images -type f -name '*.png' -print0 \
| xargs -0 -n1 -P6 -I{} bash -lc 'convert "{}" "${0%.png}.webp"' {}
핵심 옵션/패턴
-P N: 동시에 실행할 프로세스 수입니다. 보통 CPU 코어 수 또는 I/O 대기 비율을 보고 2~8 정도에서 시작합니다.-n1: 입력 1개당 명령 1회 실행입니다. 파일 단위 작업에서 실수가 줄어듭니다.-0: 널 구분 입력을 받습니다.find -print0와 같이 써서 공백, 괄호, 한글 파일명도 안전하게 처리합니다.-I{}: 입력 값을 명령 중간에 끼워 넣을 때 씁니다. 다만 속도는 조금 느려질 수 있습니다.- 패턴 팁: 처음에는
-P1로 테스트하고, 결과가 맞으면-P4,-P8로 올리면 안전합니다.
명령 출력 예시
$ find . -maxdepth 1 -type f -name '*.log' -print0 | xargs -0 -n1 -P4 gzip -9
gzip: app-2026-02-17.log: compressed 92.1%
gzip: app-2026-02-18.log: compressed 91.8%
gzip: worker-1.log: compressed 89.7%
gzip: worker-2.log: compressed 90.3%
$ wc -l checksums.txt
248 checksums.txt
$ head -3 checksums.txt
7e9d7d... /data/a.bin
3b102a... /data/b.bin
1fca0d... /data/c.bin
자주 하는 실수
find ... | xargs rm를 바로 실행하는 실수- 병렬로 지우는 명령은 복구가 어렵습니다. 먼저
echo를 붙여 실제 대상이 맞는지 확인한 뒤 실행하세요.
- 병렬로 지우는 명령은 복구가 어렵습니다. 먼저
-print0없이 파일명을 넘기는 실수- 공백이 있는 파일명이 잘려서 다른 파일에 명령이 들어갈 수 있습니다.
find -print0와xargs -0를 같이 쓰는 습관이 안전합니다.
- 공백이 있는 파일명이 잘려서 다른 파일에 명령이 들어갈 수 있습니다.
-P를 너무 크게 주는 실수- 디스크 I/O나 원격 스토리지 작업은 병렬 수가 커지면 오히려 느려집니다. 작은 값부터 올려야 합니다.
검증 방법
# 압축 결과 확인
find . -maxdepth 1 -type f -name '*.gz' | wc -l
# 손상 여부 확인
gzip -t ./*.gz && echo "gzip 무결성 OK"
# 병렬 처리 중 CPU/로드 확인
uptime
vmstat 1 5
운영 팁
긴 작업은 screen이나 tmux에서 돌리세요. SSH가 끊겨도 작업이 살아남습니다.
운영 서버에서는 표준출력을 로그 파일로 남겨 두면, 중간 실패 파일을 다시 처리할 때 훨씬 편합니다.
예를 들어 ... | xargs ... 2>&1 | tee batch-run.log 형태로 남기면 재시도 대상을 빠르게 추릴 수 있습니다.
출처
- GNU Findutils Manual
- GNU xargs Manual
- Ubuntu Manpages