일이 없는 家

XARGS(1) 본문

Debian manpage [bash]

XARGS(1)

자발적 막노동 2024. 10. 25. 12:20

NAME
       xargs - 표준 입력에서 명령줄을 빌드하고 실행한다.

SYNOPSIS
       xargs [options] [command [initial-arguments]]

DESCRIPTION
      이 매뉴얼은 xargs의 GNU 버전을 설명한다.
     xargs는 표준 입력에서 공백(큰따옴표나 작은따옴표 또는 백슬래시로 보호될 수 있음) 또는 줄바꿈으로 구분된 항목을 읽고, 표준 입력에서 받은 항목을 초기 인수에 이어지는 인수로 설정하여 명령(기본명령은 echo)을 한 번 또는 그 이상의 횟수로 실행한다.

      표준 입력의 빈 줄은 무시한다.

      명령줄은 -n, -L옵션이 사용되지 않는 한 시스템에 의해 지정된 기본 한계에 도달할 때까지 빌드할 수 있다.
 지정된 명령은 입력 항목을 모두 사용하기 위해 필요한 만큼의 횟수만큼 호출된다.
예) url목록이 작성된 파일을 읽어 각각의 url을 호출하여 결과를 얻는다고 한다면,  url갯수만큼 호출한다는 말이다.

일반적으로 입력 항목보다 호출 횟수가 훨씬적다. 이는 성능상의 잇점을 반증한다. 
일부 명령은 병렬도 실행될 수 있다(-P).

 파일 이름에 공백과 줄바꿈이 포함될 수 있는 유닉스의 기본 설정은 xargs의 작동에 문제가 될 수 있다.
공백 또는 줄바꿈이 포함된 파일 이름은 xargs에서 오작동을 일으킨다.

-0 옵션을 사용하여 이 문제를 피할 수 있다.
이 옵션을 사용할 때는 xargs에 대한 입력을 생성하는 쪽에서 구분 기호로 널 문자를 사용해야 한다.
예) GNU find의 경우 -print0 옵션이 위 언급한 널문자를 구분 기호로 사용하여 결과를 리턴한다.

명령 호출 결과가 255 상태로 종료되면 xargs는 추가 입력을 읽지 않고 즉시 중지한다. 에러메세지는 stderr로 보내어진다.

OPTIONS
       -0, --null
              입력 항목은 공백 대신 널 문자로 종료되며, 따옴표와 백슬래시는 특수 문자로 인지하지 않고 문자 그대로 읽는다.
              다른 인수와 마찬가지로 EOF 문자열은 비활성화된다. 입력 항목에 공백, 따옴표 또는 백슬래시가 포함될 수 있는 경우에 유용하다.
              GNU find -print0 옵션은 이 모드에 적합한 입력을 생성한다.

       -a file, --arg-file=file
              표준 입력 대신 파일에서 항목을 읽는다.
              이 옵션을 사용하면 입력을 주어진 파일에서 읽기 때문에 명령이 실행될 때 stdin을 변경없이 유지하고, 이 옵션을 사용하지 않으면 stdin이 /dev/null에서 리디렉션된다.

-a 옵션으로 test파일을 통해 ls를 수행한다.
stdin을 통해 a.mdr...c.mdr을 입력받아 ls를 수행한다. (stdin 탈출은 ctrl-d)


       --delimiter=delim, -d delim
              입력 항목은 지정된 문자로 구분된다.
지정된 구분 기호는 단일 문자, \n과 같은 C 스타일 이스케이프 문자 또는 8/16진수 이스케이프 코드일 수 있다.
[ 문자 A를 8진수로 표시하면 \101, 16진수 이스케이프문자로 표시하면 \0061 이렇게 표시할 수 있다. ]

8진수 및 16진수 이스케이프 코드는 printf 명령의 경우와 동일하게 처리된다.
다중 바이트 문자는 지원되지 않습니다.

입력을 처리할 때 따옴표와 백슬래시는 특수 문자로 인식되지 않고 문자 그대로 받아들여진다.

-d 옵션은 다른 인수와 마찬가지로 처리되는 모든 파일 끝 문자열(EOF)을 비활성화한다.
입력이 단순히 줄바꿈으로 구분된 항목으로 구성된 경우에 이 옵션을 사용할 수 있지만, 가능하다면 --null을 사용하도록 프로그램을 디자인하는 편이 좋다.

기본 delim은 공백문자(뇌피셜: 정규식 \s+)이다.

 

구분자 :로 지정. "a b"는 뒤에 따르는 $\n(표준입력 중 발생)을 포함하여 오류 발생
구분자를 space로 지정. -d옵션 지정시 ", \는 특수문자로 인식되지 않는다.


       -E eof-str
              파일 끝 문자열(EOF)을 eof-str로 설정한다.
파일 끝 문자열이 입력 줄에 나타나면 그 이후 나머지 입력은 무시된다.
-E도 -e도 사용하지 않으면 파일 끝 문자열은 없는 것으로 처리한다.

       -e[eof-str], --eof[=eof-str]
              -E 옵션과 같다. 이 옵션 대신 -E를 사용한다. (POSIX 호환)

종료문자인 s를 만나면 자동 종료한다. -d옵션과 같이 사용은 불가하다.


       -I replace-str
              표준입력에서 읽은 항목을 지정한 replace-str로 치환환다.
또한 따옴표로 처리하지 않은 공백은 입력항목을 구분짓지 않는다. 구분자는 줄바꿈문자이다.
-x -L 1을 의미한다.

       -i[replace-str], --replace[=replace-str]
             이 옵션은 비활성화되었고 -I옵션과 같다. -I옵션을 사용해야 한다.

기본 실행 명령이 echo임을 알 수 있다. %를 replace-str로 지정한다.


       -L max-lines
              명령줄당 최대 max개의 공백이 아닌 입력줄을 사용한다.
끝에 공백이 있으면 입력줄이 논리적으로 다음 입력줄에서 계속된다. -x를 의미한다.

       -l[max-lines], --max-lines[=max-lines]
              이 옵션은 비활성화되었고 -L 옵션과 같다. (POSIX 호환) 

       -n max-args, --max-args=max-args
              명령줄당 최대 max-args 인수를 사용한다.
size(-s 옵션 참조)가 초과되면 max-args 인수보다 적게 사용되지만, -x 옵션이 주어지면 xargs가 종료된다.

파싱 결과 arg를 2개 이상 사용할 때는 I replace-str로는 해결이 안된다.

       -P max-procs, --max-procs=max-procs
              한 번에 최대 max-procs개의 프로세스를 실행한다. 기본값은 1.
max-procs가 0이면 xargs는 가능한 한 많은 프로세스를 한 번에 실행한다.

-P 옵션은 -n 옵션이나 -L 옵션과 함께 사용한다. 그렇지 않으면 exec가 하나만 수행될 가능성이 있다.
xargs가 실행되는 동안 프로세스에 SIGUSR1 신호를 보내 동시에 실행할 명령 수를 늘리거나 SIGUSR2 신호를 보내 숫자를 줄일 수 있다.

 구현에서 정의한 한도(--show-limits로 표시)를 초과하여 늘릴 수 없고 1 이하로 줄일 수도 없다.
xargs는 명령을 종료하지 않는다. 줄이라는 요청을 받으면 다른 명령을 시작하기 전에 한 개 이상의 기존 명령이 종료될 때를 기다린다.

 공유 리소스에 대한 병렬 액세스를 적절하게 관리하는 것은 호출된 프로세스에 달려있다.
예를 들어, 진행중인 프로세스 중 두 개 이상이 stdout에 인쇄하려고 하는 경우 인쇄결과는 섞이거나 구분되지 않는 순서로 나올 수 있다. lock등으로 이 문제를 처리할 수 있지만, 이런 경우 일반적으로 올바른 출력을 보장하면서 성능이 저하된다. 성능 차이를 용납할 수 없다면 각 프로세스가 별도의 출력 파일을 생성하도록 간단히 조정하거나 별도의 리소스를 사용할 수 있다.

       -o, --open-tty
              명령을 실행하기 전에 자식 프로세스에서 /dev/tty로 stdin을 다시 연다.
이 옵션은 xargs가 대화형 애플리케이션을 실행할 때 유용하다.

       -p, --interactive
              사용자에게 각 명령줄의 실행 여부를 묻고 터미널에서 줄을 읽는다.
응답이 `y' 또는 `Y'로 시작하는 경우에만 명령줄을 실행한다. -t를 의미한다.

출력 때마다 출력여부를 질의한다.


       --process-slot-var=name
              환경변수를 실행 중인 각 자식 프로세스에서 고유한 값으로 설정한다.
자식 프로세스가 종료되면 값은 재사용된다.
예를 들어, 기본적인 부하 분산 계획에서 이를 사용할 수 있다. 부하분산계획은 무엇인지 모름.

       -r, --no-run-if-empty
              표준 입력에 공백이 아닌 문자가 없으면 명령을 실행하지 않는다.
일반적으로 명령은 입력이 없더라도 한 번은 실행한다. 이 옵션은 GNU 확장판이다.

       -s max-chars, --max-chars=max-chars
              명령줄당 최대 max-chars 문자를 사용한다.
이 문자수에는 명령 및 초기 인수와 인수 문자열 끝의 종료문자 null을 포함한다.

허용되는 가장 큰 값은 시스템에 따라 다르며 exec에 대한 인수 길이 제한에서 환경의 크기와 헤드룸? 2048바이트를 뺀 값으로 계산된다.
이 값이 128KiB보다 크면 128Kib가 기본값으로 사용된다. 그렇지 않으면 기본값이 최대값이다.
xargs는 자동적으로 더 엄격한 제약 조건에 적응한다.

       --show-limits
              운영 체제, xargs 지정 버퍼 크기 그리고 -s 옵션에 의해 설정된 명령줄 길이에 대한 제한을 표시한다.
xargs가 아무것도 하지 않도록 하려면 /dev/null에서 입력을 파이프로 보내고 --no-run-if-empty를 지정할 수도 있다.

       -t, --verbose
              실행하기 전에 stderr에 명령줄을 출력한다. 실제 수행되는 명령줄을 디버깅 차원에서 확인해 볼 수 있다.

       -x, --exit
              크기(-s 옵션 참조)를 초과하면 종료한다.

       --help xargs의 옵션 써머리를 출력하고 종료한다.

       --version
              xargs의 버전 번호를 출력하고 종료한다.

      --max-lines(-L, -l), --replace(-I, -i) 및 --max-args(-n) 옵션은 상호 배타적이다.
즉, 위 옵션 중 일부가 동시에 지정된 경우 xargs는 일반적으로 마지막으로 지정된 옵션을 사용하고 충돌이 있는 앞선 옵션은 기본값으로 설정한다. 추가적으로 xargs는 stderr에 경고 진단을 표시한다.

이 규칙의 예외는 --replace (-I, -i) 뒤에 특수한 max-args 값 1('-n1')이 무시된다. 실제로 충돌하지 않기 때문이다.

EXAMPLES
       find /tmp -name core -type f -print | xargs /bin/rm -f
       /tmp 디렉토리내에서 파일명이 core인 파일을 찾아 삭제한다.
       주의. 파일명에 줄바꿈문자나 공백문자가 포함되어 있다면 비정상적 자동을 한다.

       find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
       /tmp 디렉토리내에서 파일명이 core인 파일을 찾아 삭제한다.
       파일이나 디렉터리 이름에 공백문자나 줄바꿈문자가 포함되어 있어도 올바르게 처리되도록 파일 이름을 처리한다.

       find /tmp -depth -name core -type f -delete
       /tmp 디렉토리내에서 파일명이 core인 파일을 찾아 삭제한다. 이전 예제보다 더 효율적이다.
      (rm을 시작하기 위해 fork(2) 및 exec(2)를 사용할 필요가 없다. 추가 xargs 프로세스가 필요하지 않다).

       cut -d: -f1 < /etc/passwd | sort | xargs echo
      시스템의 모든 사용자에 대한 간략한 목록을 출력한다.

EXIT STATUS
       xargs 는 아래 상태코드로 종료한다.

              0      성공한 경우
              123    상태코드 1-125 로 종료한 경우
              124    상태코드 255로 종료한 경우
              125    signal에 의해 종료한 경우
              126    명령을 실행할 수 없는 경우
              127    명령을 찾지 못한 경우
              1      기타 에러가 발생한 경우

       128보다 큰 종료 코드는 셸에서 치명적인 신호로 인해 프로그램이 종료되었음을 나타내는 데 사용된다.

STANDARDS CONFORMANCE
       As of GNU xargs version 4.2.9, the default behaviour of xargs is not to have a logical end-of-file marker.  POSIX  (IEEE  Std  1003.1,  2004 Edition) allows this.

       The  -l  and  -i options appear in the 1997 version of the POSIX standard, but do not appear in the 2004 version of the standard.
Therefore you should use -L and -I instead, respectively.

       The -o option is an extension to the POSIX standard for better compatibility with BSD.

       The POSIX standard allows implementations to have a limit on the size of arguments to the exec functions.  
This limit could  be  as  low  as 4096  bytes including the size of the environment.  
For scripts to be portable, they must not rely on a larger value.
However, I know of no implementation whose actual limit is that small.  
The --show-limits option can be used to discover the actual limits in force on the current system.

BUGS
       It  is  not  possible for xargs to be used securely, since there will always be a time gap between the production of the list of input files and their use in the commands that xargs issues.  If other users have access to the system, they can manipulate the filesystem  during  this time window to force the action of the commands xargs runs to apply to files that you didn't intend.  For a more detailed discussion of this and related problems, please refer to the ``Security Considerations'' chapter in the findutils Texinfo documentation.  The  -execdir  option of find can often be used as a more secure alternative.

       When you use the -I option, each line read from the input is buffered internally. 
This means that there is an upper limit on the length of input line that xargs will accept when used with the -I option.  To work around this limitation, you can use the -s option to  increase  the amount  of buffer space that xargs uses, and you can also use an extra invocation of xargs to ensure that very long lines do not occur.  

For example:
       somecommand | xargs -s 50000 echo | xargs -I '{}' -s 100000 rm '{}'

       Here, the first invocation of xargs has no input line length limit because it doesn't use the -i option.  
The  second  invocation  of  xargs does have such a limit, but we have ensured that it never encounters a line which is longer than it can handle.   This is not an ideal solution.  Instead, the -i option should not impose a line length limit, which is why this discussion appears in the BUGS section.  
The  problem doesn't occur with the output of find(1) because it emits just one filename per line.

REPORTING BUGS
       GNU findutils online help: <https://www.gnu.org/software/findutils/#get-help>
       Report any translation bugs to <https://translationproject.org/team/>

       Report any other issue via the form at the GNU Savannah bug tracker:
              <https://savannah.gnu.org/bugs/?group=findutils>
       General topics about the GNU findutils package are discussed at the bug-findutils mailing list:
              <https://lists.gnu.org/mailman/listinfo/bug-findutils>

COPYRIGHT
       Copyright © 1990-2022 Free Software Foundation, Inc.  License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
       This is free software: you are free to change and redistribute it.  There is NO WARRANTY, to the extent permitted by law.

SEE ALSO
       find(1), kill(1), locate(1), updatedb(1), fork(2), execvp(3), locatedb(5), signal(7)

       Full documentation <https://www.gnu.org/software/findutils/xargs>
       or available locally via: info xargs

                                                                                                                                           XARGS(1)

참고할 만한 명령줄 예제
find ? | xargs cp -t /target-directory
현재 디렉토리에 있는 파일을 목적디렉토리에 복사한다. (한 자로 구성된 파일을 대상)

find ? | xargs -Ia rm -f ./target-directory/a
현재 디렉토리에 있는 파일명과 같은 파일명의 다른 디렉토리의 파일을 제거한다. (한 자로 구성된 파일명을 대상)

'Debian manpage [bash]' 카테고리의 다른 글

SED  (0) 2024.10.25
LSATTR(1)  (0) 2024.10.11
ARCH(1)  (0) 2024.10.10
LS (1)  (0) 2024.10.10
CAT(1)  (0) 2012.10.02