리눅스 xargs 사용법과 파이프 활용
find로 찾은 파일을 한꺼번에 지우거나, 목록에 있는 서버마다 같은 명령을 돌리고 싶을 때 쓰는 명령이 xargs다. 앞 명령의 출력을 받아 다음 명령의 인자로 넘겨 준다. 이 글은 실무에서 자주 쓰는 xargs 사용법 예제와 파일 이름에 공백이 있을 때의 처리, 병렬 실행까지 정리한다. 텍스트를 가공하는 sed와 awk는 sed awk 사용법에 먼저 정리해 두었다.

파이프와 xargs 차이
파이프(|)는 앞 명령의 출력을 다음 명령의 “입력”으로 넘긴다. 그런데 rm, mkdir처럼 입력이 아니라 인자로 대상을 받는 명령은 파이프만으로는 동작하지 않는다. 이때 xargs가 입력을 읽어 인자로 바꿔 준다.
# 동작하지 않음: rm 은 표준 입력을 읽지 않는다
find . -name "*.tmp" | rm
# xargs 가 목록을 인자로 바꿔 rm 에 넘긴다
find . -name "*.tmp" | xargs rm
xargs 사용법 기본 예제
# 30일 지난 로그 압축
find /var/log/myapp -name "*.log" -mtime +30 | xargs gzip
# 여러 파일에서 문자열 찾기
find /etc/nginx -name "*.conf" | xargs grep -n "server_name"
# 목록 파일의 디렉터리를 한 번에 만들기
cat dirs.txt | xargs mkdir -p
find와 grep 사용법은 find와 grep 사용법에 정리했다.
공백이 있는 파일 이름 처리
xargs는 기본으로 공백과 줄바꿈을 구분자로 쓰기 때문에 “my file.txt” 같은 이름을 두 개로 나눠 버린다. find의 -print0과 xargs의 -0을 함께 쓰면 널 문자로 구분해 안전하다.
find . -name "*.jpg" -print0 | xargs -0 ls -lh
xargs 사용법 자주 쓰는 옵션
| 옵션 | 뜻 |
|---|---|
-0 | 널 문자로 구분(find -print0 과 함께) |
-n 1 | 한 번에 인자 1개씩 넘겨 실행 |
-I {} | {} 자리에 값을 넣어 실행 |
-P 4 | 최대 4개를 동시에 실행 |
-r | 입력이 비어 있으면 실행하지 않기(GNU) |
-p | 실행 전에 하나씩 확인 |
# {} 자리에 값 넣기: 파일마다 백업 복사본 만들기
ls *.conf | xargs -I {} cp {} {}.bak
# 서버 목록에 같은 명령 실행
cat servers.txt | xargs -I {} ssh {} "uptime"
# 이미지 4개씩 병렬 변환
find . -name "*.png" -print0 | xargs -0 -P 4 -I {} cwebp -q 80 {} -o {}.webp
find -exec와 비교
find -exec 명령 {} \;는 파일마다 명령을 한 번씩 실행하고, find -exec 명령 {} +와 xargs는 여러 파일을 묶어 한 번에 넘긴다. 파일이 많을수록 묶어서 넘기는 쪽이 훨씬 빠르다. 간단한 작업은 find -exec … +, 병렬 실행이나 다른 명령 출력을 넘길 때는 xargs를 쓰면 된다.
주의할 점
- rm처럼 되돌릴 수 없는 명령은 먼저 xargs echo rm으로 무엇이 실행될지 확인한다.
- 입력이 비었을 때 명령이 인자 없이 실행되면 의도와 다를 수 있다. GNU xargs는 -r로 막는다.
- 원격 실행(ssh)을 여러 서버에 할 때는 SSH 키가 등록되어 있어야 한다(SSH 키 인증).
옵션 전체는 GNU findutils xargs 매뉴얼에 있다.
xargs 사용법 정리
파이프로 넘긴 목록을 “명령의 인자”로 바꿔야 할 때 xargs를 떠올리면 된다. 공백 파일은 -print0과 -0, 값 위치 지정은 -I {}, 병렬은 -P만 기억하자. 반복해서 쓰는 조합은 쉘 스크립트로 저장해 두면 편하다.
첫 댓글을 남겨보세요