운영체제/Linux

xargs 명령에 대해서

ahgle 2022. 9. 7. 14:42
728x90
반응형

xargs

앞 명령어의 출력값을 다음 명령어의 인자(argument)로 넘기는 역할을 한다.

|(파이프) 이전의 명령의 결과를 인자로 받아 명령어를 실행하는 구조이다.

|(파이프) 뒤에 추가하여 사용한다.

두 개 이상의 명령어를 조합해서 사용할 때 큰 효과를 낸다.

 

 

사용 예시)

echo "file1 file2 file3 |xargs touch
// file1 file2 file3 이라는 문자열을 touch 의 인수로 넘겨주어
// touch file1 file2 file3 명령을 수행한 것과 같은 결과를 준다. (빈 파일 3개 생성)

 

그런데....다음 명령어의 인자로 넘긴다는 말이 이해가 잘.......🤣

 

인자(Parameter) 와 인수(Argument)란, 그리고 인자와 인수의 차이가 궁금하다면 아래 링크 클릭!

https://wowy0211.tistory.com/7

 

어쨌든 인자는 결국 실제로 넘겨주는 값을 의미한다.

결국 xargs 라는 명령어를 파이프(|)와 뒤에 사용하게되면 앞의 출력의 결과를 넘겨받아서 고대로 다른 명령어에게 던져서 사용한다는건데..

 

 

예시를 통해 직접 알아보자.

ll
total 0
-rw-r--r-- 1 root root 0 Sep  8 16:45 test01.bak
-rw-r--r-- 1 root root 0 Sep  7 14:21 test01.txt
-rw-r--r-- 1 root root 0 Sep  8 16:45 test02.bak
-rw-r--r-- 1 root root 0 Sep  7 14:21 test02.txt
-rw-r--r-- 1 root root 0 Sep  8 16:45 test03.bak
-rw-r--r-- 1 root root 0 Sep  7 14:21 test03.txt

ls |grep "\.bak$"|xargs rm 
ll
total 0
-rw-r--r-- 1 root root 0 Sep  7 14:21 test01.txt
-rw-r--r-- 1 root root 0 Sep  7 14:21 test02.txt
-rw-r--r-- 1 root root 0 Sep  7 14:21 test03.txt

 

#ls |grep "\.bak$" |xargs rm 명령어를 보자

 

.bak으로 끝나는 파일을 출력한 후 xargs를 통해 다음 명령어인 rm의 인자(argument)로 넘기고 있다. 따라서 .bak으로 끝나는 모든 파일들이 rm명령에 의해 삭제된 것을 알 수 있다.

 

별도의 옵션이 없을 경우 이전 명령에 의한 출력 값은 xargs 명령에서 가장 끝으로 가게 된다는 점에 주의한다.

때에 따라 인자의 위치를 명시적으로 지정해야 할 경우가 있다.

cp, mv 명령이 대표적이다. 아래의 예시를 보자. ls와 grep으로 추려낸 .bak 파일을 ./bak_files 디렉토리에 복사한다.

 

[root@test 0912] ls |grep "\.bak$" |xargs mv ./bak_files/
mv: target ‘9.bak’ is not a directory

[root@test 0912] ls |grep "\.bak$" |xargs -I{} cp {} ./bak_files

맨 처음 명령에서는 출력되는 인자가  mv 명령의 맨 끝이 아니라  중간에 인자로 들어가야 하기 때문에 에러가 발생한다.

#mv 이동 파일명(인자) 이동시킬 위치   이런 식으로 가야하기 때문이다.

 

따라서 I(대문자 i) 옵션을 사용하여 {} 문자열로 지정한 자리에 인자값이 위치하도록 한다.

위의 두 번째 예시를 보면  -I{} 옵션을 사용하여 {} 에 인자값이 위치할것을 암시한 후,  cp 명령어 뒤에 {} 문자열을 사용하여 인자값이 cp 명령에 뒤에 오도록 했다. 이후 에러가 안나고 bak_files 디렉토리 아래 정상적으로 .bak 으로 끝나는 파일들이 복사되었다.

 

-I 옵션 외에 -i 옵션으로도 사용이 가능하지만, xargs 매뉴얼에서는 -i 옵션은 옛날 방식이므로 -I 옵션을 사용하도록 권고하고 있다.

 

👀특수문자 깨알 참고

< \ >

특수문자의 앞에 써서 특수문자가 아닌 일반 문자로 인식하게끔한다.

< " " 또는 ' ' >

' '는 모든 특수 문자를, " "는 $, ` , \ 를 제외한 모든 특수문자를 제외해서 출력한다.

 

-print0 : 줄바꿈 없이 출력

 

 

 

 

 

참고 링크

http://bahndal.egloos.com/577448

https://froghome.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90

 

[bash: xargs] 앞 명령어의 출력 결과를 다음 명령어의 인자(argument)로 사용하기

xargs 명령은 두개 이상의 명령어를 조합할 때 아주 요긴하다. 앞 명령어의 결과를 다음 명령어의 입력으로 넘기는 파이프(|)와 함께 사용함으로써, 앞 명령어의 출력값을 다음 명령어의 인자(argum

bahndal.egloos.com

 

728x90