xargs 명령어: 사용법과 -n, -I 옵션, find와 함께 쓰기

xargs 명령어는 표준 입력으로 받은 줄과 낱말을 다른 명령의 인자로 바꿔 실행하는 리눅스 도구입니다. AlmaLinux 9 서버의 작업 폴더에서 find가 찾은 로그 파일 셋을 xargs로 wc에 넘겨 보니, 이름에 공백이 든 파일 하나가 둘로 쪼개져 오류가 났고 -print0과 -0을 붙이자 세 파일의 줄 수가 모두 나왔습니다.
아래 출력은 AlmaLinux 9.8 서버의 root 계정으로 작업 폴더 안에서 실행한 결과입니다. 이름 목록과 로그, 임시 파일은 시험용으로 만든 예시 파일이고, 그 안의 IP 주소와 작업 폴더 경로도 예시 값입니다.
1️⃣ xargs 명령어 기본 사용법
xargs는 앞 명령이 넘긴 표준 입력을 공백과 줄바꿈 단위로 나눠, 뒤에 적은 명령의 인자 자리에 붙여 실행합니다. 이름이 줄마다 하나씩 든 names.txt로 확인했습니다.
cat names.txtalice
bob
carol
dave
erincat의 출력을 xargs echo로 넘기면 다섯 줄이 echo 한 번의 인자가 되어 한 줄로 나옵니다.
cat names.txt | xargs echoalice bob carol dave erin뒤에 명령을 적지 않으면 xargs는 echo를 실행하므로 결과가 같습니다.
cat names.txt | xargsalice bob carol dave erin파이프는 앞 명령의 출력을 뒤 명령의 표준 입력으로 잇는 통로라, 뒤 명령의 인자 자리에는 아무것도 들어가지 않습니다. 파일 이름 셋이 든 list.txt를 wc -l에 파이프로만 넘기면, wc는 목록 자체의 줄 수 3을 셉니다.
cat list.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3사이에 xargs를 두면 목록의 이름 셋이 wc의 인자가 되어 파일마다 줄 수가 나옵니다.
cat list.txt | xargs wc -l 3 logs/access.log
2 logs/error.log
1 tmp/keep.txt
6 total2️⃣ xargs -n과 -I 옵션
옵션이 없으면 입력 전부가 명령 한 번에 들어가므로, 명령을 되풀이 실행하려면 -n으로 한 번에 넘길 인자 수를 정합니다. 아래 그림에서 같은 다섯 이름이 옵션에 따라 어떻게 묶이는지 확인할 수 있습니다.
-n 1은 이름 하나마다 echo를 실행해 다섯 줄이 나옵니다.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2는 두 개씩 묶고 남은 하나는 따로 넘깁니다.
cat names.txt | xargs -n 2 echoalice bob
carol dave
erin실행되는 명령을 눈으로 확인하려면 -t를 붙입니다. 명령 줄이 먼저 나오고 그 아래에 출력이 따라옵니다.
cat names.txt | xargs -t -n 2 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erin인자가 명령 맨 뒤가 아닌 자리에 들어가야 하면 -I로 자리 표시 글자를 정합니다. {} 자리에 한 줄씩 들어가고, 같은 글자가 여러 번 있으면 모두 바뀝니다.
cat names.txt | xargs -I {} echo 'user: {}'user: alice
user: bob
user: carol
user: dave
user: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erin같은 방식으로 이름마다 폴더를 만들 수 있습니다. home 폴더를 먼저 만든 뒤 -I {}로 그 아래에 이름별 폴더를 만들면 다섯 폴더가 생깁니다.
mkdir homecat names.txt | xargs -I {} mkdir home/{}ls homealice bob carol dave erin-I는 한 줄을 인자 하나로 다루므로 -n과 함께 쓸 수 없습니다. 둘을 같이 적었을 때는 경고와 함께 -I가 무시되고, {}가 글자 그대로 출력되었습니다.
cat names.txt | xargs -I {} -n 2 echo {}xargs: warning: options --replace and --max-args/-n are mutually exclusive, ignoring previous --replace value
{} alice bob
{} carol dave
{} erin-L은 줄 수로 묶습니다. 한 줄에 낱말이 여럿이면 그 줄의 낱말이 함께 넘어가고, 한 줄에 이름이 하나뿐인 names.txt에서는 -L 2가 -n 2와 같은 결과를 냈습니다.
cat names.txt | xargs -L 2 echoalice bob
carol dave
erin3️⃣ find xargs 조합
이름 목록을 손으로 만들지 않아도, find가 찾은 파일 목록을 바로 xargs에 넘길 수 있습니다. 로그 폴더에서 .log로 끝나는 파일을 찾으면 세 개가 나오고, 그중 하나는 이름에 공백이 들어 있습니다.
find /root/work/logs -name '*.log'/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.log이 목록을 그대로 xargs wc -l에 넘기자 공백이 든 이름이 old와 access.log 둘로 쪼개져 오류 두 줄이 나왔고, 합계도 두 파일만 더한 5줄이었습니다.
find /root/work/logs -name '*.log' | xargs wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
wc: /root/work/logs/old: No such file or directory
wc: access.log: No such file or directory
5 totalfind의 -print0은 이름 사이를 줄바꿈 대신 널 문자로 구분하고, xargs의 -0은 그 널 문자로만 인자를 나눕니다. 둘을 붙이면 공백이 든 파일까지 세 파일의 줄 수가 나옵니다.
find /root/work/logs -name '*.log' -print0 | xargs -0 wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalfind의 -exec 옵션으로도 같은 일을 합니다. {} 뒤에 +를 붙이면 찾은 파일을 한 번에 넘기므로 결과가 같고, 파일 이름의 공백도 find가 그대로 전달합니다. xargs는 find가 아닌 명령의 출력도 받으므로 입력이 find 하나가 아닐 때 쓰고, 한 번에 넘길 개수(-n)나 동시 실행 수(-P)를 정해야 할 때도 xargs를 사용합니다.
find /root/work/logs -name '*.log' -exec wc -l {} + 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 total찾은 파일 가운데 문자열이 든 파일만 고르려면 xargs 뒤에 grep -l을 붙입니다. wp-login이 든 파일은 접속 로그와 오류 로그 둘이었습니다.
find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login/root/work/logs/access.log
/root/work/logs/error.log4️⃣ xargs 명령어 파일 삭제
xargs 뒤에 rm을 붙이면 찾은 파일이 한 번에 지워지므로, 지우기 전에 어떤 파일이 넘어가는지 먼저 확인합니다. rm 앞에 echo를 두면 실행될 명령 줄만 나오고 파일은 그대로 남습니다.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 echo rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmpls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txt-p를 붙이면 명령마다 실행할지 묻습니다. n을 입력하면 아무것도 지우지 않아 임시 파일 셋이 그대로 남습니다.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...nls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txty를 입력하면 세 파일이 지워지고 keep.txt만 남습니다.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...yls tmpkeep.txt입력이 비어 있으면 xargs는 명령을 인자 없이 한 번 실행합니다. 빈 파일을 넘기면 rm이 인자 없이 실행되어 [rm: missing operand] 오류가 나고, -r을 붙이면 명령 자체가 실행되지 않습니다.
cat empty.txt | xargs rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ xargs 명령어 병렬 실행, 구분자와 옵션
🔲 병렬 실행과 구분자
명령이 하나씩 차례로 실행되면 대상이 많을 때 시간이 그만큼 늘어납니다. -P는 동시에 실행할 명령 수를 정합니다. 1초, 2초, 3초, 4초를 기다리는 sleep 넷은 차례로 실행했을 때 10초, -P 4로 동시에 실행했을 때 가장 긴 4초에 끝났습니다.
time seq 1 4 | xargs -n 1 sleep
real 0m10.007s
user 0m0.004s
sys 0m0.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006s입력이 줄바꿈이나 공백이 아닌 기호로 나뉘어 있으면 -d로 구분자를 정합니다. 쉼표로 이은 이름 셋을 -d ,로 나누면 이름마다 한 줄씩 나옵니다.
printf 'alice,bob,carol' | xargs -d , -n 1 echoalice
bob
carol표준 입력 대신 파일에서 읽으려면 -a에 파일 이름을 적습니다. 파이프 없이 names.txt의 다섯 이름이 echo로 넘어갔습니다.
xargs -a names.txt echoalice bob carol dave erin🔲 xargs 명령어 옵션
📌 주요 옵션: 이 글에서 실행한 결과
| 옵션 | 하는 일 | 이 글에서 본 결과 | |
|---|---|---|---|
| -n | 명령 한 번에 넘길 인자 수를 정함 | 다섯 이름이 -n 2로 두 개씩 묶여 echo가 세 번 실행 | |
| -I | 자리 표시 글자에 한 줄씩 넣어 줄마다 실행 | {} 자리에 이름이 들어감, -n과 함께 적으면 경고와 함께 -I가 무시됨 | |
| -L | 명령 한 번에 넘길 줄 수를 정함 | 한 줄에 이름이 하나뿐인 파일에서는 -n 2와 같은 결과 | |
| -t | 실행할 명령 줄을 먼저 출력 | 명령 줄이 출력보다 먼저 나옴 | |
| -0 | 널 문자로만 입력을 나눔(find -print0과 함께) | 없으면 공백 든 이름이 쪼개져 오류 두 줄, 붙이면 세 파일 모두 6줄 | |
| -p | 명령마다 실행할지 물음 | n이면 그대로 남고 y면 세 파일 삭제 | |
| -r | 입력이 비면 명령을 실행하지 않음 | 없으면 [rm: missing operand], 붙이면 실행하지 않음 | |
| -P | 동시에 실행할 명령 수를 정함 | sleep 넷이 차례로 10초, -P 4로 4초 | |
| -d | 입력을 나눌 구분자를 정함 | -d ,로 이름마다 한 줄 | |
| -a | 표준 입력 대신 파일에서 입력을 읽음 | names.txt의 다섯 이름이 echo 한 번에 |
📎 그 밖의 옵션: 공식 매뉴얼 기준
| 옵션 | 하는 일 | |
|---|---|---|
| -s | 명령 한 줄에 쓸 최대 글자 수를 정함 | |
| -x | -s 크기를 넘으면 실행하지 않고 끝냄 | |
| -E | 입력에서 이 글자만 든 줄을 만나면 나머지 입력을 읽지 않음 | |
| -o | 실행하는 명령의 표준 입력을 터미널로 다시 엶(대화형 프로그램용) | |
| --process-slot-var | 동시에 실행되는 명령마다 환경 변수에 다른 번호를 넣음 |
🔲 xargs 명령어 시뮬레이터
아래 시뮬레이터에서 같은 시험 파일에 xargs와 find 명령을 직접 입력해 볼 수 있습니다.
🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.