728x90
반응형
  • 기본적인 명령어 뒤에 파이프로 추가하여 사용
  • 파이프 이전에 명령을 인자로 받아 명령어를 실행하는 구조

xargs [옵션] 명령어

  • 옵션
    - a : 표준 입력 대신 파일에서 항목을 읽음, 이 옵션을 사용하여 명령을 실행하면 stdin(표준 스트림)은 변경되지 않는다. 그렇지 않으면 stdin이 /dev/null에서 리다이렉션 됨
    - O : 공백이나 특수문자를 찾을때 사용 (문자를 그대로 사용)
    (Ex. find /opt -name “*.[ch]” | xargs touch -> 여기서 파일 이름에 공백이 있을 경우 각각 분리된 파일로 넘겨지는데 find /opt -name “*.[ch]” -print0 | xargs -O touch 형식으로 사용하면
    -print0 은 파일 사이의 공백을 \0으로 분리자로 출력하고 xargs에서는 \0으로 표시된 분리자를 인식하여 하나의 파일이름으로 인식하고 다음 인자로 넘어간다)
    - d : 입력된 문자를 그대로 사용한다 (따음표, 백슬래쉬 같은 특수문자), 단순히 문자가 스페이스 같은걸로 분리되어 있을때 사용가능 하지만 다른 인수와 같이 처리되는 데는 사용 불가능
    - n : 지정된 숫자만큼 행을 출력 (앞에서 들어오는 인자의 수를 제한할 수 있다. 앞에서 5개의 표준 입력이 만들어져도 -n 으로 지정한 숫자만큼의 매개변수가 넘어온다.)
    - p : 사용자에게 각 명령 행을 실행할지 여부와 터미널에서 행을 읽는거에 대한 여부를 묻는다 ( yes , no 지정)
    - P : 하나의 명령에 프로세스 지정, -n 옵션과 같이 사용 ( -n으로 10개의 출력을 한다면 -p를 사용시 -n만큼의 프로세스가 실행, -p를 0으로 지정하면 한번에 사용할수 있는 프로세스를 모두 사용)
    - t : xargs를 통해 구성된 명령어를 표준 에러로 출력 (실행된 커먼드가 무엇인지 표시하므로 디버깅과정에 유용)
    - s : 한 라인에 들어갈 수 있는 문자열 수를 지정, 기본적으로 128k 안으로 문자열을 만들어 하나의 명령을 실행하나 해당 옵션은 최대 1024k까지 사용가능하게 한다.
    - x : -s 로 지정한 크기가 초과되면 종료시킨다
    —show-limits : xargs의 버퍼 크기 선택 및 -s 옵션에 대한 길이 제한을 출력
    - E : 문자열 끝을 eof-str로 설정한다. 
    - I(i) : xargs에 전달된 라인 전체를 뒤에 나오는 명령어의 인자로 사용 (디폴트로 라인 전체를 의미하는 기호는 {} 이다)
    (Ex. find . -name “*.c”” | xargs -i {} sh -c ‘echo -n {} >> c_file.txt; stat -c %Y {} >> c_file.txt’ -> 하위 폴더에서 모든 C로 끝나는 파일들을 찾아 파일이름과 날짜롤 c.file.txt에 저장)
    - l(L) : 해당 명령을 사용하면 명령어 뒤에 공백이 있으면 다음 행으로 인식하는게 아닌 다음줄에 입력 라인에 있어도 논리적으로 이어지게 한다.
    (-l 옵션을 사용하면 읽어들이는 각 행은 내부적으로 버퍼링이 된다. -l 옵션만 사용하는 경우 허용하는 버퍼의 상한이 있어 제한이 걸리는데 (대량의 파일이나 행을 읽어들이는 경우) -s 옵션을 함께 사용하면
    -s 옵션에 지정된 만큼 버퍼 크기를 늘릴 수 있으며 매우 긴 행이 발생되지 않도록 할 수 있다)

  • 예제
    # find /tmp -name core -type f -print | xargs /bin/rm -f
    (/tmp 디랙토리 아래 core라는 파일을 찾아 삭제)

    # fine /tmp -name core -type -f -print0 | xargs -O /bin/rm -f
    (공백이나 개행 문자가 들어가 있는 파일이나 디렉토리 이름을 올바르게 처리되도록 파일 이름을 처리하여 core 파일을 삭제)

    # find /tmp -depth -name core -type f -delete
    (위의 두 예제와 같은 내용이나 이번 예제가 더 효율적이다. rm 을 시작하기위해 fork와 exec를 사용하여 프로세스를 생성하지 않기 때문)

    # ls *.txt | xargs cat >> abc.txt
    (ls를 이용하여 text파일을 모두 읽어와 하나의 파일로 병합한다)

    # ls | grep “*.bak” | xargs cp /home/bak_file -> X
    위와 같이 명령을 실행하면 오류가 발생한다. 출력값이 cp 명령에서 맨끝이 아니라 중간에 인자로 들어가기 때문이다. 이럴 경우 -i(-I) 옵션을사용하여 출력값을 어느위치에서 인자로 사용할 것인지 지정해주면 된다.
    # ls | grep “*.bak” | xargs -I{} cp {} /home/bak_file -> O 또는 # ls | grep “*.bak” | xargs -i cp {} /home/bak_file -> O
    (소문자 i를 사용하는 방식이 옛날 방식이므로 대문자 I를 사용한것을 권장한다, -i에는 기본값을 지정하는 것이 없다)

    # find ~/ -type f | grep -H “*.txt$” | xargs grep -H “abcd”
    (디렉토리에서 txt파일을 우선 찾은 다음 이름에 abcd를 포함하는 파일을 또 찾음)

    # cat url-list.txt | xargs wget -c
    (파일안에 url이 있을 경우 해당 인자들을 모두 wget으로 넘겨 다운받는다)

    # find / -name “*.jpg” -type -f -print | xargs tar -cvzf images.tar.gz
    (모든 jpg파일을 찾아 images.tar.gz로 압축) 

    # ls *.jpg | xargs -n1 -I{} cp {} /external-hard-drive/tmp
    (ls 로 출력된 모든 이미지를 하나씩 인자로 받아 외장하드로 복사)

   


반응형

'Linux' 카테고리의 다른 글

Linux Memory 재할당  (0) 2018.08.08
Linux rsync  (0) 2018.08.08
Linux Multipath Error  (0) 2018.08.08
Linux FTP 구성  (0) 2018.08.08
Linux ipmitool (openimpi)  (0) 2018.08.08

+ Recent posts