본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/리눅스

[Linux] xargs 알아두기

by 미노드 2023. 7. 11.

개발할 때 java에서 main메소드 호출하다보면 args 라는걸 인자로 받는걸 알 수 있다.

이와 비슷한 기능으로 리눅스에서 xargs라는게 있다.
지금것 개발해오면서 xargs라는걸 접할 일이 없었다보니 잘 몰랐으나
공부하면서 이런게 있다는걸 알게되었다.

일반적으로 명령어 뒤에 파이프와 같이 쓰는데, 예를들면 이런식이다.
find . -type f -print | xargs grep -i "20230711*" /dev/null

현재 경로에서 파일 중에 데이터에서 20230711로 시작되는 문구가 있는 파일을 찾는 명령어이다.
왜 이런 결과가 나오는지 알아두자

- xargs 설명

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

- grep 설명

  • 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력
  • 다른 명령어와 조합하여 사용함

정리해보면, xargs는 명령어를 실행하는 목적으로 사용한다.
grep은 출력을 담당한다.

이 둘을 섞어서 사용한게 위의 예시이다.

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 옵션에 지정된 만큼 버퍼 크기를 늘릴 수 있으며 매우 긴 행이 발생되지 않도록 할 수 있다)