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

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8root 계정2026-10-29 확인

xargs 명령어는 표준 입력으로 받은 줄과 낱말을 다른 명령의 인자로 바꿔 실행하는 리눅스 도구입니다. AlmaLinux 9 서버의 작업 폴더에서 find가 찾은 로그 파일 셋을 xargs로 wc에 넘겨 보니, 이름에 공백이 든 파일 하나가 둘로 쪼개져 오류가 났고 -print0과 -0을 붙이자 세 파일의 줄 수가 모두 나왔습니다.

아래 출력은 AlmaLinux 9.8 서버의 root 계정으로 작업 폴더 안에서 실행한 결과입니다. 이름 목록과 로그, 임시 파일은 시험용으로 만든 예시 파일이고, 그 안의 IP 주소와 작업 폴더 경로도 예시 값입니다.

1️⃣ xargs 명령어 기본 사용법

  • ↪️ 표준 입력을 명령의 인자로

xargs는 앞 명령이 넘긴 표준 입력을 공백과 줄바꿈 단위로 나눠, 뒤에 적은 명령의 인자 자리에 붙여 실행합니다. 이름이 줄마다 하나씩 든 names.txt로 확인했습니다.

cat names.txt
alice
bob
carol
dave
erin

cat의 출력을 xargs echo로 넘기면 다섯 줄이 echo 한 번의 인자가 되어 한 줄로 나옵니다.

cat names.txt | xargs echo
alice bob carol dave erin

뒤에 명령을 적지 않으면 xargs는 echo를 실행하므로 결과가 같습니다.

cat names.txt | xargs
alice bob carol dave erin

파이프는 앞 명령의 출력을 뒤 명령의 표준 입력으로 잇는 통로라, 뒤 명령의 인자 자리에는 아무것도 들어가지 않습니다. 파일 이름 셋이 든 list.txt를 wc -l에 파이프로만 넘기면, wc는 목록 자체의 줄 수 3을 셉니다.

cat list.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

사이에 xargs를 두면 목록의 이름 셋이 wc의 인자가 되어 파일마다 줄 수가 나옵니다.

cat list.txt | xargs wc -l
  3 logs/access.log
  2 logs/error.log
  1 tmp/keep.txt
  6 total

2️⃣ xargs -n과 -I 옵션

  • ↪️ 묶음 크기, 인자 자리, -t 확인

옵션이 없으면 입력 전부가 명령 한 번에 들어가므로, 명령을 되풀이 실행하려면 -n으로 한 번에 넘길 인자 수를 정합니다. 아래 그림에서 같은 다섯 이름이 옵션에 따라 어떻게 묶이는지 확인할 수 있습니다.

🧩 xargs가 표준 입력을 명령의 인자로 묶는 방식
설명 다이어그램
⚙️ 옵션
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① 표준 입력 (names.txt)alicebobcaroldaveerin줄마다 이름 하나, 다섯 줄입니다.
② 인자로 묶기alicebobcaroldaveerin옵션이 없으면 다섯 개를 한 묶음으로 만듭니다.alicebobcaroldaveerin-n 2는 두 개씩 묶고, 남은 하나는 따로 묶습니다.alicebobcaroldaveerin-I {}는 한 줄을 한 묶음으로 두고 {} 자리에 넣습니다.
③ 실행되는 명령과 출력echo alice bob carol dave erinalice bob carol dave erinecho가 한 번 실행됩니다.echo alice bobecho carol daveecho erinecho가 세 번 실행되고 묶음마다 한 줄씩 나옵니다.echo 'user: alice' echo 'user: bob' … erin까지 같은 꼴로 다섯 번user: aliceuser: bobuser: caroluser: daveuser: erinecho가 다섯 번 실행되고 {} 자리에 이름이 들어갑니다.
옵션이 없으면 xargs는 입력에서 읽은 낱말 전부를 명령 한 번의 인자로 붙입니다. 다섯 이름이 echo 한 번에 넘어가 한 줄로 나옵니다.
-n 2를 붙이면 낱말을 두 개씩 묶어 명령을 되풀이 실행합니다. 다섯 이름은 세 묶음이 되어 echo가 세 번 실행됩니다.
-I {}를 붙이면 한 줄을 하나로 보고, 명령 안의 {} 자리에 그 줄을 넣어 줄마다 실행합니다. 인자가 맨 뒤가 아닌 자리에 들어가야 할 때 사용합니다.

-n 1은 이름 하나마다 echo를 실행해 다섯 줄이 나옵니다.

cat names.txt | xargs -n 1 echo
alice
bob
carol
dave
erin

-n 2는 두 개씩 묶고 남은 하나는 따로 넘깁니다.

cat names.txt | xargs -n 2 echo
alice bob
carol dave
erin

실행되는 명령을 눈으로 확인하려면 -t를 붙입니다. 명령 줄이 먼저 나오고 그 아래에 출력이 따라옵니다.

cat names.txt | xargs -t -n 2 echo
echo 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: erin
cat names.txt | xargs -I {} echo '{} -> home/{}'
alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erin

같은 방식으로 이름마다 폴더를 만들 수 있습니다. home 폴더를 먼저 만든 뒤 -I {}로 그 아래에 이름별 폴더를 만들면 다섯 폴더가 생깁니다.

mkdir home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  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 echo
alice bob
carol dave
erin

3️⃣ find xargs 조합

  • ↪️ -print0과 -0으로 공백 든 파일 이름 넘기기

이름 목록을 손으로 만들지 않아도, 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 total

find의 -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 total

find의 -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.log

4️⃣ xargs 명령어 파일 삭제

  • ↪️ echo로 먼저 보고 -p로 확인하기

xargs 뒤에 rm을 붙이면 찾은 파일이 한 번에 지워지므로, 지우기 전에 어떤 파일이 넘어가는지 먼저 확인합니다. rm 앞에 echo를 두면 실행될 명령 줄만 나오고 파일은 그대로 남습니다.

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 echo rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

-p를 붙이면 명령마다 실행할지 묻습니다. n을 입력하면 아무것도 지우지 않아 임시 파일 셋이 그대로 남습니다.

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...n
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

y를 입력하면 세 파일이 지워지고 keep.txt만 남습니다.

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...y
ls tmp
keep.txt

입력이 비어 있으면 xargs는 명령을 인자 없이 한 번 실행합니다. 빈 파일을 넘기면 rm이 인자 없이 실행되어 [rm: missing operand] 오류가 나고, -r을 붙이면 명령 자체가 실행되지 않습니다.

cat empty.txt | xargs rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ xargs 명령어 병렬 실행, 구분자와 옵션

  • ↪️ -P, -d, -a 옵션

🔲 병렬 실행과 구분자

명령이 하나씩 차례로 실행되면 대상이 많을 때 시간이 그만큼 늘어납니다. -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.003s
time 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 echo
alice
bob
carol

표준 입력 대신 파일에서 읽으려면 -a에 파일 이름을 적습니다. 파이프 없이 names.txt의 다섯 이름이 echo로 넘어갔습니다.

xargs -a names.txt echo
alice 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 명령을 직접 입력해 볼 수 있습니다.

xargs 명령어 시뮬레이터GNU findutils 4.8
[root@server work]#
키보드 ↑↓ 로 앞에서 쓴 명령을 다시 불러옵니다.

🔢 FAQ & 추천 콘텐츠

프로세스 번호를 넘기면 kill이 그 번호로 신호를 보냅니다. 백그라운드로 실행한 sleep 600의 프로세스 번호를 셸 변수 $!로 꺼내 xargs kill에 넘기자, 작업 목록에 [Terminated sleep 600]이 남고 다음 jobs에서는 작업이 사라졌습니다. 번호 목록을 다른 명령으로 모을 때는 어떤 프로세스가 포함되는지 먼저 출력해 본 뒤 넘깁니다.

--show-limits 옵션이 한도를 출력합니다. 테스트한 서버에서는 명령 줄 길이의 POSIX 상한이 2,093,890바이트였고, xargs가 실제로 쓰는 명령 버퍼는 131,072바이트였습니다. 매뉴얼 기준으로 입력이 이 버퍼보다 길면 xargs가 명령을 여러 번으로 나눠 실행합니다.

xargs가 실행한 명령 가운데 하나라도 1에서 125 사이의 코드로 실패하면 xargs의 종료 코드는 123이 됩니다. 공백이 든 파일 이름이 쪼개진 wc 실행과 빈 입력으로 rm을 실행한 경우가 모두 123이었고, 명령을 찾지 못한 경우는 127이었습니다. 셸 스크립트에서 xargs 뒤의 종료 코드를 검사할 때 이 값을 기준으로 삼습니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

인간임을 증명하세요: 7   +   9   =