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 |