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
: 여러 인자를 한 번에 처리 -> 빠름