xargs

xargs
xargs
개발자다양한 오픈 소스 및 상용 개발자
운영 체제Unix, Unix 계열, IBM i
플랫폼크로스 플랫폼
유형명령어

xargs ("eXtended ARGumentS"의 줄임말)는 Unix 및 대부분의 Unix 유사 운영 체제에서 표준 입력에서 명령을 빌드 및 실행하는 데 사용되는 명령어입니다.표준 입력으로부터의 입력을 인수로 변환합니다.

다음과 같은 명령어가 있습니다.grep그리고.awk는 명령줄 인수 또는 표준 입력 중 하나로 입력을 받을 수 있습니다.다만, 다음과 같은 다른 것들도 있습니다.cp그리고.echo는 입력만 인수로 받을 수 있기 때문에 xargs가 필요합니다.

이전 버전의 GNU 포트 xargs는 일반적인 GNU Unix 유사 [2]유틸리티의 nativeWin32 포트의 UnxUtils 컬렉션의 일부로 Microsoft Windows에서 사용할 수 있습니다.wargs라는 이름의 기초적인 개서는 오픈 소스[3] TextTools 프로젝트의 일부입니다.xargs 명령어는 IBM i 운영시스템에도 [4]이식되어 있습니다.

xargs 명령어의 사용 예 중 하나는 rm 명령을 사용하여 파일 목록을 삭제하는 것입니다.POSIX 시스템에는 명령줄의 [5][6]최대 총 길이를 나타내는ARG_MAX가 있기 때문에 명령어가 실패하고 "Argument list too long"이라는 오류 메시지가 표시될 수 있습니다(즉, exec 시스템콜의 명령줄 길이 제한을 초과했음을 의미합니다). rm /path/*또는rm $(find /path -type f)(후자의 호출은 출력에서 글로브가 확장될 수 있으므로 올바르지 않습니다.)

이것은 다음 명령어를 사용하여 다시 작성할 수 있습니다.xargs인수 목록을 허용 가능한 작은 하위 목록으로 분할하려면 다음 명령을 사용합니다.

find /path -type f -print xargs rm

위의 예에서 유틸리티는 다음 입력 정보를 제공합니다.xargs파일명의 긴 리스트가 표시됩니다. xargs다음으로 이 목록을 서브리스트와 콜로 분할합니다.rm모든 서브리스트에 대해 한 번씩.

xargs의 일부 실장에서는 동작의 병렬화를 위해서도 사용할 수 있습니다.-P maxprocsinput 인수목록에서 명령어를 실행하기 위해 사용되는 병렬 프로세스의 수를 지정합니다.그러나 출력 스트림은 동기화되지 않을 수 있습니다.이 문제를 해결하려면--output file가능한 경우 인수를 지정하고 처리 후 결과를 결합합니다.다음 예제에서는 24개의 프로세스를 큐잉하고 다른 프로세스를 시작하기 전에 각 프로세스가 완료될 때까지 대기합니다.

/path -name '.foo' xargs -P 24 -I '{}' /cpu/bound/process '{}' -o '{}'out을 찾습니다.

xargs는 많은 명령어 대체 기능과 같은 기능을 취급하는 경우가 많습니다. 기능은 백쿼트 표기법(backquote 표기법)으로 나타납니다.`...`또는$(...)). xargs는 다음과 같은 파일의 긴 목록을 출력하는 명령어에도 적합합니다.find,locate그리고.grep, 단, 를 사용합니다.-0(또는 동등한 것)--null)이후xargs없이.-0를 포함한 파일명을 취급하지 않는다.',"및 공간.GNU Parallel은 파일 이름에 포함된 경우 Find, LocateGREP와 더 나은 호환성을 제공하는 유사한 도구입니다.',", 및 공간(newline은 계속 필요)-0).

인수 배치

- I 옵션: 단일 인수

xargs 명령어는 명령줄 끝 이외의 위치에 나열된 인수를 삽입하는 옵션을 제공합니다.-Ioption to xargs는 명령어를 실행하기 전에 지정된 입력으로 대체되는 문자열을 사용합니다.일반적인 선택은%.

$ mkdir ~/backups $ find /path -type f -name '*~' -print0 xargs - 0 - I % cp -a % ~/backups

바꿀 문자열이 명령 부분에 여러 번 표시될 수 있습니다.I를 사용하면 매번 사용되는 행 수가 1개로 제한됩니다.

트릭: 임의의 숫자

비슷한 효과를 얻기 위한 또 다른 방법은 부팅된 명령어로 셸을 사용하여 셸의 복잡성에 대처하는 것입니다.다음은 예를 제시하겠습니다.

$ mkdir ~/find $ find / path - type f -name '*~' - print0 xargs - 0 sh -c 파일 이름, cp -a "$filename" ~/filename; done" sh

그 말sh행의 말미에 있는 것은 POSIX 쉘용입니다. sh -c대신하다$0, 위치 파라미터의 「설정 가능한 이름」부분(v)입니다.이 파일이 존재하지 않는 경우, 최초로 일치하는 파일의 이름이 대신 할당됩니다.$0파일이 복사되지 않습니다.~/backups그 빈칸을 채우려면 다른 단어를 사용할 수도 있습니다.my-xargs-script예를들면.

부터cp는, 복수의 파일을 동시에 수신할 수 있습니다.또, 다음의 조작도 간단하게 실시할 수 있습니다.

$ find /path -type f -name '*~' -print0 xargs - 0 sh -c 'if [ $# -gt 0 ] ; cp -a "$@" ~/backup; fi" sh

이 스크립트는 실행됩니다.cp인수가 전달되었을 때 모든 파일이 지정됩니다.이렇게 하는 것이 더 효율적입니다.이것은, 1회 밖에 기동할 수 없기 때문입니다.cp각 호출에 대해 이루어집니다.sh.

구분자 문제

많은 Unix 유틸리티는 회선 지향입니다.이것들은 와 함께 사용할 수 있습니다.xargs행에 포함되지 않는 한',", 또는 공백입니다.일부 Unix 유틸리티는 레코드 구분자로 NUL을 사용할 수 있습니다(: Perl (필요한 경우)-0그리고.\0대신\n),locate(사용방법)-0),find(사용방법)-print0),grep(비활성화)-z또는-Z),sort(사용방법)-z)의 사용방법-0위해서xargs는 문제를 해결하지만 많은 Unix 유틸리티가 NUL을 구분자로 사용할 수 없습니다(예:head,tail,ls,echo,sed,tar -v,wc,which).

하지만 종종 사람들은 이것을 잊고xargs또, 회선 지향이지만, 실제로는 그렇지 않습니다(디폴트 단위).xargs 바꿈과 줄 바꿈을 구분하는 경우 공백이 있는 서브스트링은 단일 또는 이중으로 구분해야 합니다.)

세퍼레이터의 문제는 다음과 같습니다.

# touch important_file touch 'not important_file' mkdir -p '12' records' find .-name not \* tail - 1 xargs rm find \!-type d tail - 1 xargs rmdir

상기의 실행으로 인해important_file삭제되지만 디렉토리 중 어느 것도 삭제되지 않습니다.12" records, 파일도 호출되지 않았습니다.not important_file.

적절한 수정은 GNU 고유의-print0옵션, 단,tail(및 기타 도구)는 NUL 종단 문자열을 지원하지 않습니다.

# 위와 같은 준비 명령어를 사용합니다.-name not \* -print0 xargs - 0 rm find \! -name . -type d -print0 xargs - 0 rmdir

를 사용하는 경우-print0옵션에서는 엔트리는 줄 끝 문자가 아닌 늘 문자로 구분됩니다.이것은 more verbose 명령어와 동일합니다.find . -name not\* tr \\n \\0 xargs -0 rm또는 더 짧게, 전환하여xargs(비 POSIX) 회선 지향 모드로의-d(옵션) 옵션:find . -name not\* xargs -d '\n' rm

그러나 일반적으로는-0와 함께-print0파일 이름의 새 행이 여전히 문제가 되므로 를 사용하는 것이 좋습니다.

GNUparallel대신할 수 있다xargs같은 옵션을 가지도록 설계되어 있지만 회선 지향입니다.따라서 대신 GNU Parallel을 사용하면 위의 내용은 [7]예상대로 작동합니다.

Unix 환경에서xargs는 지원되지 않습니다.-0또한-d옵션(예: Solaris, AIX)은 POSIX 표준에 따라 모든 문자를 간단히 백슬래시 이스케이프할 수 있다고 명시되어 있습니다.find . -name not\* sed 's/\(.\)/\\\1/g' xargs rm또는 GNU 병렬 또는 를 사용하여 xargs 를 사용하지 않도록 할 수 있습니다.[8]-exec ... +기능성find.

한 번에 인수의 서브셋에 대한 조작

한 번에 1개 또는2개의 인수만 받아들일 수 있는 명령어를 취급하는 경우가 있습니다.예를 들어,diff명령어는 한 번에 2개의 파일로 동작합니다.-n할 수 있는 선택권xargs는 지정된 명령어에 한번에 제공할 인수 수를 지정합니다.이 명령어는 모든 입력이 소진될 때까지 반복적으로 호출됩니다.입력이 불충분한 경우 마지막 호출 시 필요한 인수 수보다 적은 수의 인수를 얻을 수 있습니다.사용하다xargs입력을 1행당2개의 인수로 분할합니다.

$ 에코 {0}..9} xargs -n 2 0 1 2 3 4 5 6 7 8 9

지정된 수의 인수에 따라 한 번에 실행할 수 있을 뿐만 아니라 를 사용하여 각 입력 행에 대해 명령어를 호출할 수도 있습니다.-L 1선택.한 번에 임의의 수의 행을 사용할 수 있지만 가장 일반적입니다.이렇게 하면 된다diff모든 [9]git이 부모에 대해 커밋합니다.

$git log --format="%H %P" xargs - L1 git diff

인코딩 문제

의 인수 구분자 처리xargs의 사용상의 문제는,xargs디폴트 모드로 설정합니다.파일 이름 조작에 자주 사용되는 대부분의 Unix 도구(예:sed,basename,sort, 등)은 텍스트 처리 도구입니다.그러나 Unix 경로 이름은 실제 텍스트가 아닙니다.경로 이름 /aaa/bbb/cc를 고려합니다./aaa 디렉토리와 그 bbb 서브 디렉토리는 일반적으로 다른 환경을 가진 다른 사용자에 의해 작성될 수 있습니다.즉, 이러한 사용자는 다른 로케일을 설정할 수 있습니다.즉, aaa와 bbb는 반드시 같은 문자 인코딩을 가질 필요는 없습니다.예를 들어 aaa는 UTF-8에 있고 bb는 Shift JIS에 있습니다.그 결과, Unix 시스템의 절대 패스명은, 1 문자의 부호화에 의한 텍스트로서 올바르게 처리되지 않는 경우가 있습니다.텍스트 입력에 의존하는 도구는 이러한 문자열에서 실패할 수 있습니다.

이 문제의 회피책 중 하나는 이러한 툴을 C 로케일로 실행하는 것입니다.C 로케일은 기본적으로 입력 바이트를 그대로 처리합니다.단, 사용자가 예상하지 못한 방법으로 툴의 동작을 변경합니다(예를 들어 케이스 폴딩 동작에 대한 사용자의 기대 중 일부가 충족되지 않을 수 있습니다).

레퍼런스

  1. ^ "The Unix Acronym List: The Complete List". www.roesler-ac.de. Retrieved 2020-04-12.
  2. ^ "Native Win32 ports of some GNU utilities". unxutils.sourceforge.net.
  3. ^ "Text processing tools for Windows".
  4. ^ IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). Retrieved 2020-09-05.
  5. ^ "GNU Core Utilities Frequently Asked Questions". Retrieved December 7, 2015.
  6. ^ "The maximum length of arguments for a new process". www.in-ulm.de.
  7. ^ xargs와 GNU 병렬의 차이점GNU.org 를 참조해 주세요.2012년 2월에 액세스.
  8. ^ xargs – 셸 및 유틸리티 레퍼런스, 단일 UNIX 사양, The Open Group 버전 4
  9. ^ Cosmin Stejerean. "Things you (probably) didn't know about xargs". Retrieved December 7, 2015.

외부 링크

수동 페이지