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
'운영체제 > Linux' 카테고리의 다른 글
vsftp 접근이 안될 때 ( 에러 : 500 oops vsf_sysutil_bind maximum number of attempts to find a listening port exceeded) (0) | 2022.11.14 |
---|---|
tar archive에 대해서 (tar 압축, tar압축 해제) (0) | 2022.11.08 |
데몬(daemon)에 대해서 (0) | 2022.10.25 |
wget 명령어를 이용한 파일 다운로드 (2) | 2022.09.19 |
rsync명령어에 대해서 (옵션 정리) (2) | 2022.09.16 |