xargs

대부분의 Linux 커맨드는 파일 목록, 문자열 등의 결과를 출력하는 것을 목적으로 실행됩니다. 하지만 앞에서 실행된 결과의 일부를 다른 커맨드의 매개변수로 활용해야 하는 경우가 있습니다. 예를 들어 파일의 유형(실행 파일, ASCII 텍스트 등)을 확인하기 위한 file 커맨드에서 파일네임만을 출력하도록 한 뒤, 이 결과를 ls -l 커맨드에 매개변수로 전달하여 타임스탬프를 확인하고자 하는 상황을 생각해 볼 수 있습니다. xargs 커맨드가 바로 이러한 목적으로 사용됩니다. 이 커맨드를 실행하면 다른 커맨드의 결과를 매개변수로 활용할 수 있습니다. 아래와 같은 명령을 가정해 봅시다.

file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr
위 커맨드의 문자열을 자세히 분석해 보겠습니다. 먼저, file -Lz *는 파일이 심볼릭 링크인지 또는 압축 파일인지를 확인합니다. 그리고 결과는 다음 커맨드인 grep ASCII 전달됩니다. 여기서 "ASCII" 문자열이 검색되어 아래와 같은 형태의 출력이 생성됩니다.
alert_DBA102.log:        ASCII English text
alert_DBA102.log.Z: ASCII text (compress'd data 16 bits)
dba102_asmb_12307.trc.Z: ASCII English text (compress'd data 16 bits)
dba102_asmb_20653.trc.Z: ASCII English text (compress'd data 16 bits)
여기에서는 파일네임만이 관심 사항이기 때문에 다음 커맨드 cut -d":" -f1을 실행하여 첫 번째 필드만 표시되도록 합니다.
alert_DBA102.log
alert_DBA102.log.Z
dba102_asmb_12307.trc.Z
dba102_asmb_20653.trc.Z

이제 ls -l 커맨드에 한 번에 하나씩 위의 목록을 매개변수로 전달합니다. xargs 커맨드가 바로 이러한 목적으로 사용됩니다. 마지막에서 xargs ls -ltr 명령은 전달된 결과에 대해 ls -ltr을 실행합니다. 결과적으로 아래와 같은 명령이 순차적으로 실행됩니다.

ls -ltr alert_DBA102.log
ls -ltr alert_DBA102.log.Z
ls -ltr dba102_asmb_12307.trc.Z
ls -ltr dba102_asmb_20653.trc.Z

xargs은 독자적으로 사용되는 명령은 아니지만, 다른 커맨드와 조합되었을 때 매우 강력한 기능을 발휘합니다.

또 다른 예로 파일의 라인 수를 카운트하는 경우를 생각해 볼 수 있습니다.

$ file * | grep ASCII | cut -d":" -f1  | xargs wc -l
47853 alert_DBA102.log
19 dba102_cjq0_14493.trc
29053 dba102_mmnl_14497.trc
154 dba102_reco_14491.trc
43 dba102_rvwr_14518.trc
77122 total

(참고: 위와 동일한 작업을 아래 명령을 통해 실행할 수도 있습니다.)

$ wc -l ‘file * | grep ASCII | cut -d":" -f1 | grep ASCII | cut -d":" -f1‘

Linux는 여러 가지 방법으로 동일한 작업을 실행할 수 있도록 지원하고 있습니다. 사용자는 상황에 따라 가장 적절한 방법을 사용하면 됩니다.

같은 방법을 사용하여 디렉토리 내의 여러 파일의 이름을 한꺼번에 변경할 수 있습니다.

$ ls | xargs -t -i mv {} {}.bak

"-i" 옵션은 xargs 커맨드가 "{}" 부분을 각 아이템의 이름으로 대치하도록 지시하고 있습니다. 또 "-t" 옵션은 xargs가 실행 이전에 커맨드를 출력하도록 합니다.

vi를 이용하여 편집할 파일을 여는 과정에서도 활용이 가능합니다.

$ file * | grep ASCII | cut -d":" -f1 | xargs vi

이 커맨드는 vi를 사용하여 파일을 한 번에 하나씩 열도록 지시하고 있습니다. 이 방법은 여러 개의 파일을 검색한 후 편집을 위해 여는 경우 유용합니다.

xargs 커맨드는 다양한 옵션을 지원합니다. 가장 유용한 옵션으로 "-p"를 들 수 있을 것입니다. "-p"는 인터액티브 작업을 위해 사용됩니다.

$ file * | grep ASCII | cut -d":" -f1 | xargs -p vi
vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc
dba102_reco_14491.trc dba102_rvwr_14518.trc ?...

위에서 xarg는 각 커맨드가 실행하기 전에 확인 프롬프트를 띄우고 있습니다. 사용자가 "y"를 누르면 커맨드가 실행됩니다. 파일의 이동, 덮어쓰기 등 잠재적인 위험성을 갖는 작업을 사용하는 경우 이 방법이 매우 유용하게 활용될 수 있을 것입니다.

"t" 옵션은 "verbose" 모드입니다. 실행될 커맨드가 무엇인지 표시하므로 디버깅 과정에서 유용합니다.

xargs 커맨드의 매개변수로 아무런 출력도 입력되지 않는 경우에는 어떻게 될까요? 다음과 같은 경우를 생각해 봅시다.

$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t wc -l
wc -l
0
$
"SSSSSS" 문자열의 검색 결과 매치가 반환되지 않았습니다. 따라서 xargs에는 아무런 입력도 전달되지 않습니다(-t 옵션을 이용해서 이를 확인할 수 있습니다). 경우에 따라서는 처리할 대상이 존재하지 않는 경우 xargs의 실행을 중단해야 할 수도 있습니다. 이를 위해 사용되는 것이 -r 옵션입니다.
$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t -r wc -l
$

이 커맨드는 실행할 대상이 존재하지 않는 경우 종료 처리합니다.

rm 커맨드와 xargs 커맨드를 함께 사용해서 여러 파일을 한꺼번에 삭제하는 경우를 생각해 봅시다. rm이 받아들일 수 있는 매개변수의 수에는 한계가 있습니다. 입력되는 매개변수의 수가 이를 초과하는 경우에는 어떻게 해야 할까요? -n 옵션을 사용하면 xargs에서 사용하는 매개변수의 수를 제한할 수 있습니다.

커맨드 라인 별로 매개변수의 수를 2 개로 제한하는 방법이 아래와 같습니다. 5 개의 파일이 xargs ls -ltr로 전달되었더라도, 2 개의 파일만이 한 번에 ls -ltr로 전달됩니다.

$ file * | grep ASCII | cut -d":" -f1 | xargs -t -n2 ls -ltr  
ls -ltr alert_DBA102.log dba102_cjq0_14493.trc
-rw-r----- 1 oracle dba 738 Aug 10 19:18 dba102_cjq0_14493.trc
-rw-r--r-- 1 oracle dba 2410225 Aug 13 05:31 alert_DBA102.log
ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc
-rw-r----- 1 oracle dba 5386163 Aug 10 17:55 dba102_mmnl_14497.trc
-rw-r----- 1 oracle dba 6808 Aug 13 05:21 dba102_reco_14491.trc
ls -ltr dba102_rvwr_14518.trc
-rw-r----- 1 oracle dba 2087 Aug 10 04:30 dba102_rvwr_14518.trc

같은 방법을 사용하여 디렉토리 내의 여러 파일의 이름을 한꺼번에 변경할 수 있습니다.

$ ls | xargs -t -i mv {} {}.bak

"-i" 옵션은 xargs 커맨드가 "{}" 부분을 각 아이템의 이름으로 대치하도록 지시하고 있습니다.

find -name '*temp*' -print0 | xargs -0 cp -t /data/backup/DBSpace_Gsp/
find -name '*temp*' | xargs -t -i cp {} /data/backup/DBSpace_Gsp/


'OS > LINUX' 카테고리의 다른 글

YUM 사용법  (0) 2011.05.13
vi 사용하기  (0) 2011.05.03
GNU screen  (0) 2011.04.23
/etc/sysconfig/i18n - 시스템의 한글 깨짐 문제 해결  (0) 2011.04.23
cut  (0) 2011.04.15

+ Recent posts