Profile picture

[Linux] xargs 명령어 가이드

JaehyoJJAng2023년 03월 15일

xargs란?

xargs표준 입력(stdin) 으로부터 값을 받아서, 명령어의 인자(argument) 로 넘겨주는 역할을 합니다.

즉, 어떤 명령어가 출력한 리스트를 받아서, 이를 또 다른 명령어에 넘겨주는 중간 역할을 합니다.


기본 구조

command1 | xargs command2
  • command1의 출력 결과를
  • xargs가 받아서
  • command2에 인자로 넘겨 실행

xargs를 쓰는 이유?

리눅스에서는 어떤 명령은 출력을 표준 출력(stdout) 으로 주고, 다른 명령은 인자를 직접 입력해야 합니다.

이 둘을 연결해주는 게 바로 xargs 랍니다.

예를 들어, find로 파일을 찾고, 그 파일들을 cat이나 rm에 넘기고 싶을 때 아주 유용하죠.


그런데 find 명령을 사용해보신 분이라면 굳이 xargs를 써야하나? 라는 생각이 드실 수 있습니다.

왜냐구요? find 명령어에는 exec이라는 옵션이 존재하기 때문이죠!

그 둘의 차이점에 대해서는 조금 있다가 서술해보도록 하겠습니다.


실전 예제 모음

1. 텍스트 파일을 찾아서 내용 출력하기

find . -name "*.txt" | xargs cat
  • 현재 디렉토리 이하에서 .txt 파일을 모두 찾아
  • cat 명령어로 내용을 출력합니다.

2. 특정 문자열이 포함된 파일 찾기

find . -type f | xargs grep "에러"
  • 현재 디렉토리 이하에서 "에러"라는 문자열이 포함된 파일 내용을 출력합니다.

3. 파일 이름에 공백이 있을 때 (안전하게)

find . -type f -name "*.txt" -print0 | xargs -0 grep "오류"
  • -print0: 널 문자(\0)로 구분해서 출력
  • -0: xargs가 널 문자 기준으로 인자 구분

파일 이름에 공백, 탭, 개행 등이 있어도 안전하게 처리할 수 있습니다.


4. 자리표시자 사용하기

echo "file1.txt file2.txt" | xargs -n 1 -I {} echo "처리 중: {}"
  • -n 1: 한 번에 하나의 인자 전달
  • -I {}: 자리표시자로 {} 사용

결과:

처리 중: file1.txt
처리 중: file2.txt

5. 병렬 처리로 속도 높이기

cat urls.txt | xargs -n 1 -P 4 curl -O
  • urls.txt에 있는 파일들을 4개 병렬로 다운로드
  • -P 4: 4개의 프로세스 병렬 실행
  • -n 1: 한 줄씩 하나씩 넘김

자주 사용하는 xargs 옵션

옵션 설명
-n N 한 번에 넘길 인자 수 제한
-0 null 문자(\0) 기준 인자 처리 (-print0과 함께 사용)
-I {} 자리표시자 사용 (반복된 위치에 사용 가능)
-P N 병렬 프로세스 수
-d DELIM 사용자 지정 구분자 사용

xargs vs -exec

find 명령어에서 -exec 옵션을 사용해도 동일한 동작을 할 수 있다는거 알고 계시죠?

하지만 성능과 유연성 측면에서 xargs가 더 유리할 때가 많아요.

# -exec 사용
find . -name "*.txt" -exec cat {} \;

# xargs 사용
find . -name "*.txt" | xargs cat
  • -exec: 파일마다 명령 실행 -> 느림
  • xargs: 여러 인자를 한 번에 처리 -> 빠름
    Tag -

Loading script...