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 maxprocs
input 인수목록에서 명령어를 실행하기 위해 사용되는 병렬 프로세스의 수를 지정합니다.그러나 출력 스트림은 동기화되지 않을 수 있습니다.이 문제를 해결하려면--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, Locate 및 GREP와 더 나은 호환성을 제공하는 유사한 도구입니다.'
,"
, 및 공간(newline은 계속 필요)-0
).
인수 배치
- I 옵션: 단일 인수
xargs 명령어는 명령줄 끝 이외의 위치에 나열된 인수를 삽입하는 옵션을 제공합니다.그-I
option 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 로케일은 기본적으로 입력 바이트를 그대로 처리합니다.단, 사용자가 예상하지 못한 방법으로 툴의 동작을 변경합니다(예를 들어 케이스 폴딩 동작에 대한 사용자의 기대 중 일부가 충족되지 않을 수 있습니다).
레퍼런스
- ^ "The Unix Acronym List: The Complete List". www.roesler-ac.de. Retrieved 2020-04-12.
- ^ "Native Win32 ports of some GNU utilities". unxutils.sourceforge.net.
- ^ "Text processing tools for Windows".
- ^ IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). Retrieved 2020-09-05.
- ^ "GNU Core Utilities Frequently Asked Questions". Retrieved December 7, 2015.
- ^ "The maximum length of arguments for a new process". www.in-ulm.de.
- ^ xargs와 GNU 병렬의 차이점GNU.org 를 참조해 주세요.2012년 2월에 액세스.
- ^ 단일 UNIX 사양, The Open Group 버전 4 – 셸 및 유틸리티 레퍼런스,
- ^ Cosmin Stejerean. "Things you (probably) didn't know about xargs". Retrieved December 7, 2015.
외부 링크

- The Single UNIX Specification, The Open Group 버전4 : 인수목록 작성 및 유틸리티 호출– Shell and Utilities Reference,
- Linux Xargs 명령어 튜토리얼 및 예시