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

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

예를 들어, ls 명령으로 파일 목록을 출력하고 여기서 .bak 파일만 골라 rm 명령으로 삭제하고 싶을 때 아래와 같은 형태로 가능하다.

# .bak 파일 확인
ls | grep "\.bak$"

# .bak 파일을 rm 명령으로 삭제
ls | grep "\.bak$" | xargs rm

ls와 grep의 조합으로 삭제할 대상 파일명을 추려낸 후에 이것을 rm 명령의 인자로 넘기는 것이다.

별도의 옵션이 없을 경우 이전 명령에 의한 출력값은 xargs 명령에서 가장 끝으로 가게 된다는 점에 유의하자. 때에 따라 인자의 위치를 명시적으로 지정해야 할 필요가 있을 때도 있다. cp 명령이 대표적이다. 아래의 예시를 보자. ls와 grep으로 추려낸 .bak 파일을 ./bak_files 디렉토리에 복사하는 경우이다.

# .bak 파일 복사 시도: 오류 발생!
ls | grep "\.bak$" | xargs cp ./bak_files
cp: missing destination file operand ...
Try 'cp --help' for more information.

위의 예시와 같이 사용하면 오류가 발생한다. 출력값이 cp 명령에서 맨 끝이 아니라 중간에 인자로 들어가야 하기 때문이다. 이럴 경우에는 -i 또는 -I 옵션을 이용해서 출력값을 어느 위치에서 인자로 사용할 것인지 지정해 주면 된다.

# -I 옵션으로 .bak 파일 복사 시도: 성공!
ls | grep "\.bak$" | xargs -I{} cp {} ./bak_files

# -i 옵션으로 .bak 파일 복사 시도: 성공!
ls | grep "\.bak$" | xargs -i cp {} ./bak_files

위의 예시를 보면 grep 명령의 출력값이 이어지는 cp 명령에서 "{}" 문자열로 지정한 자리에 위치하게 되어 복사가 정상적으로 이루어지게 된다. xargs 매뉴얼(man) 페이지에 의하면 -i 옵션은 옛날 방식이므로 -I 옵션을 사용하도록 권고하고 있다. -i 옵션에서 아무것도 지정하지 않을 경우 기본값으로 "{}" 문자열이 사용되고, -I 옵션에는 기본값이 없으므로 반드시 -I{} 이런 식으로 사용해야 한다.

위치 지정 문자열은 편의에 따라 적당히 바꿔서 사용할 수도 있다. 아래의 예시는 "{}" 때신 "FILE" 문자열을 사용한 경우다.

# -I 옵션
ls | grep "\.bak$" | xargs -IFILE cp FILE ./bak_files

# -i 옵션
ls | grep "\.bak$" | xargs -iFILE cp FILE ./bak_files

예시를 하나 더 보자. 홈 디렉토리(~/) 하위에서 .txt 파일만 추려낸 후, 이 중에 문자열 "abcd"를 포함하고 있는 파일이 어느 것인지 찾는 방법이다. 하위 디렉토리까지 검색해야 하므로 ls 대신 find 명령을 사용하고, grep 명령에서 파일명을 같이 출력하기 위해 -H 옵션을 사용했다.

find ~/ -type f | grep "\.txt$" | xargs grep -H "abcd"


특정 파일들에 대해 커맨드 라인 유틸리티나 명령어를 적용해야 할 경우 아주 요긴하게 활용할 수 있다.



핑백

  • 반달가면 : [bash: xargs] 공백이 포함된 출력 결과를 다음 명령어의 인자로 사용 2017-07-03 21:35:52 #

    ... 간단한 내용이지만 간혹 잊어버리고 있다가 오류가 발생하는 상황이 있어서 여기에 정리해 두기로. 우선 xargs 명령에 대한 기본적인 내용은 이전 게시물을 참고하자. 여기로 예를 들어 앞 명령어의 출력이 파일명인데 이것을 xargs 명령을 통해서 인자(argument)로 넘기고자 하는 상황을 생각해 보자. 확장자가 txt인 파일만 ... more

  • 반달가면 : [bash: find, xargs, for] find 명령으로 추려낸 여러 파일에 대해 같은 작업을 하기 위한 스크립트 2018-08-13 21:34:45 #

    ... 명령으로 넘겨서 해당 파일들에 대해 뭔가 작업을 하기 위한 스크립트를 만들 수 있다. 우선 find에 대한 기본적인 내용은 여기로, xargs에 대한 기본적인 내용은 여기로. 작업용 스크립트의 이름을 proc.sh라고 하자. 명령어 실행은 아래와 같은 형태가 될 것이다. # my_file.txt 파일에 대한 작업 bash proc. ... more

  • xargs – onesixx.com 2019-04-25 14:44:12 #

    ... cel Tool-SW BLOG Life @Private Log In Search for: xargsPublished by onesixx on 19-04-25 http://bahndal.egloos.com/577448 HTML find / -type d -mtime +180 -print0 | xargs -0 rm -rf find / -type d -mtime +18 ... more

덧글

  • ㅇㅇ 2019/03/08 14:59 # 삭제 답글

    우와 고맙습니다! 덕분에 하위 디렉토리 일일이 뒤지는 수고가 줄었어요!
  • 반달가면 2019/03/10 09:29 #

    도움 되었다니 다행입니다~
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

39703
2864
1813372

ad_widget_2