일부 Linux 명령을 함께 묶어야하는데 그 중 하나가 파이프 입력을 허용하지 않습니까? xargs
한 명령의 출력을 가져 와서 다른 명령에 매개 변수로 보낼 수 있습니다.
모든 표준 Linux 유틸리티에는 세 가지가 있습니다.그들과 관련된 데이터 스트림. 표준 입력 스트림 (stdin), 표준 출력 스트림 (stdout) 및 표준 오류 스트림 (stderr)입니다.
이 스트림은 텍스트와 함께 작동합니다. 텍스트를 사용하여 입력 (stdin)을 명령에 보내고 응답 (stdout)은 터미널 창에 텍스트로 작성됩니다. 오류 메시지는 터미널 창에 텍스트 (stderr)로 기록됩니다.
Linux 및 Unix와 유사한 기능 중 하나운영 체제는 한 명령의 stdout 출력을 두 번째 명령의 stdin 입력으로 파이프하는 기능입니다. 첫 번째 명령은 출력이 터미널 창으로 이동하지 않는다는 것을 신경 쓰지 않으며 두 번째 명령은 입력이 키보드에서 오는 것을 신경 쓰지 않습니다.
모든 Linux 명령에는 세 개의 표준 스트림이 있지만 모든 명령이 다른 명령의 표준 출력을 표준 입력으로 받아 들일 수는 없습니다. 즉, 입력을 파이프에 연결할 수 없습니다.
xargs
표준 데이터 스트림을 사용하여 실행 파이프 라인을 작성하는 명령입니다. 사용하여 xargs
우리는 다음과 같은 명령을 만들 수 있습니다 echo
, rm
, mkdir
표준 입력을 인수로 사용하십시오.
xargs 명령
xargs
파이프 입력을 받아들입니다. 파일로부터의 입력을받을 수도 있습니다. xargs
해당 입력을 작업하도록 지시 한 명령의 매개 변수로 사용합니다. 우리가 말하지 않으면 xargs
특정 명령으로 작업하려면 기본적으로 사용합니다 echo
.
우리는 그것을 사용하여 어떻게 xargs
멀티 라인 입력에서도 항상 단일 라인 출력을 생성합니다.
우리가 -1
(한 줄에 하나의 파일 나열) 옵션 ls
, 파일 이름의 단일 열을 얻습니다.
ls -1 ./*.sh
현재 디렉토리의 쉘 스크립트 파일이 나열됩니다.
예상대로 단일 열을 얻습니다. 우리가 그것을 통해 파이프 xargs
우리는 무엇을 얻습니까?
ls -1 ./*.sh | xargs
출력은 하나의 긴 텍스트 스트림으로 터미널 창에 기록됩니다.
이 기능은 xargs
다른 명령으로 매개 변수를 공급합니다.
wc와 함께 xargs 사용
사용할 수있다 xargs
쉽게 wc
여러 파일에서 단어, 문자 및 줄을 세십시오.
ls *.page | xargs wc
이것이 일어나는 일입니다.
ls
* .page 파일을 나열하고 목록을xargs
.xargs
파일 이름을wc
.wc
파일 이름을 마치 명령 줄 매개 변수로받은 것처럼 처리합니다.
각 파일에 대한 통계는 전체 합계와 함께 표시됩니다.
확인과 함께 xargs 사용
우리는 사용할 수 있습니다 -p
가지고있는 (대화식) 옵션 xargs
계속 진행할 수 있다는 확인 메시지를 표시합니다.
파일 이름 문자열을 touch
을 통해 xargs
, touch
우리를 위해 파일을 만들 것입니다.
echo 'one two three' | xargs -p touch
실행될 명령이 표시되고 xargs
“y”또는“Y”또는“n”또는“N”을 입력하고 Enter를 눌러 응답 할 때까지 기다립니다.
Enter 키만 누르면 "n"으로 처리됩니다. "y"또는 "Y"를 입력 한 경우에만 명령이 실행됩니다.
“y”를 누르고 Enter를 눌렀습니다. 사용할 수있다 ls
파일이 작성되었는지 확인하십시오.
ls one two three
여러 명령으로 xargs 사용
여러 명령을 사용할 수 있습니다 xargs
를 사용하여 -I
(초기 인수) 옵션.
이 옵션은 "replace-string"을 정의합니다. replace-string에 대한 토큰이 명령 행에 표시 될 때마다 xargs
삽입됩니다.
사용합시다 tree
현재 디렉토리에서 서브 디렉토리를 보도록 명령하십시오. 그만큼 -d
(디렉토리) 옵션 원인 tree
파일을 무시하고 디렉토리에 대해서만보고합니다.
tree -d
“images”라는 단일 하위 디렉토리가 있습니다.
“directories.txt”라는 파일에는 만들려는 일부 디렉토리의 이름이 있습니다. 우리는 내용을 사용하여 볼 수 있습니다 cat
.
cat directories.txt
이 정보를 입력 데이터로 사용하겠습니다 xargs
. 우리가 할 명령은 다음과 같습니다.
cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'
이것은 다음과 같이 분류됩니다.
- 고양이 directory.txt |: directrories.txt 파일 (모든 새 디렉토리 이름)의 내용을 푸시합니다.
xargs
. - xargs -I %: 토큰이 "%"인 "replace-string"을 정의합니다.
- 쉬 -c: 새로운 서브 쉘이 시작됩니다. 그만큼
-c
(명령)은 쉘에게 명령 행에서 명령을 읽도록 지시합니다. - '에코 %; mkdir %’: 각“%”토큰은 전달 된 디렉토리 이름으로 대체됩니다.
xargs
. 그만큼echo
명령은 디렉토리 이름을 인쇄합니다. 그만큼mkdir
명령은 디렉토리를 만듭니다.
디렉토리가 하나씩 나열됩니다.
사용할 수있다 tree
디렉토리가 작성되었는지 확인하기 위해 한 번 더.
tree -d
여러 위치에 파일 복사
사용할 수있다 xargs
단일 명령으로 파일을 여러 위치에 복사 할 수 있습니다.
우리는 두 디렉토리의 이름을 xargs
입력 매개 변수로. 우리는 말할 것이다 xargs
한 번에이 매개 변수 중 하나만 작업중인 명령에 전달합니다.
이 경우 명령은 cp
. 효과는 전화하는 것입니다 cp
두 개의 디렉토리 중 하나를 명령 행 매개 변수로 사용하여 매번 두 번. 그만큼 xargs
이를 가능하게하는 매개 변수는 -n
(최대 번호) 옵션. 이것을 하나로 설정하겠습니다.
우리는 또한 -v
(자세한) 옵션 cp
무슨 일이 일어나고 있는지보고합니다.
echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page
파일은 한 번에 한 디렉토리 씩 두 디렉토리에 복사됩니다. cp
각 파일 복사 작업을보고하여 파일이 발생하는 것을 확인할 수 있습니다.
중첩 된 디렉토리에서 파일 삭제
파일 이름에 공백과 이상한 문자 (예 : 줄 바꿈 문자)가있는 경우 xargs
제대로 해석 할 수 없습니다. -0 (널 터미네이터) 옵션을 사용하여이 문제를 극복 할 수 있습니다. 이것은 알려줍니다 xargs
파일 이름의 최종 분리 자로 널 문자를 사용합니다.
우리는 사용할 것입니다 find
이 예에서. find
파일 이름에서 공백 및 이상한 문자를 처리하기위한 자체 옵션이 있습니다. 그것은 -print0
(성명, 널 문자) 옵션.
find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"
이것은 다음과 같이 분류됩니다.
- 검색 . -name“* .png”:
find
는 현재 디렉토리 "."에서 파일 인 "* .png"와 일치하는 이름을 가진 객체를 검색합니다 (type -f
). - -print0: 이름은 널 문자로 끝나고 공백과 이상한 문자가 표시됩니다.
- xargs -0: xargs 또한 파일 이름이 null로 끝나는 것으로 간주하고 공백과 이상한 문자는 문제를 일으키지 않습니다.
- rm -v -rf“{}”: rm은 자세하고 자세한 내용을보고합니다 (
-v
). 재귀 적이며 (-r) 중첩 된 하위 디렉토리를 살펴보고 프롬프트없이 파일을 제거합니다 (-f
). “{}”은 각 파일 이름으로 대체됩니다.
모든 하위 디렉토리가 검색되고 검색 패턴과 일치하는 파일이 삭제됩니다.
중첩 된 디렉토리 제거
중첩 된 서브 디렉토리 세트를 제거하려고한다고 가정하십시오. tree
우리가 그들을 보자.
tree -d
find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"
이 명령은 find를 사용하여 현재 디렉토리 내에서 재귀 적으로 검색합니다. 검색 대상은 "level_one"이라는 디렉토리입니다. 디렉토리 이름이 전달됩니다 xargs
에 rm
.
이 명령과 이전 명령 사이의 중요한 변경 사항은 검색어가 최상위 디렉토리의 이름이며 -type d
알려줍니다 find
파일이 아닌 디렉토리를 찾습니다.
각 디렉토리의 이름은 제거 될 때 인쇄됩니다. 확인할 수있다 tree
:
tree -d
중첩 된 모든 하위 디렉토리가 삭제됩니다.
하나의 파일 유형을 제외한 모든 파일 삭제
사용할 수있다 find
, xargs
과 rm
하나의 유형을 제외하고 모든 파일을 삭제합니다. 약간 반 직관적이지만 원하는 파일 형식의 이름을 제공합니다. 유지삭제하려는 이름이 아닙니다.
그만큼 -not
옵션은 말한다 find
파일 이름을 반환하려면 하지마 검색 패턴과 일치합니다. 우리는 -I
(초기 인수) 옵션 xargs
한 번 더. 이번에는 정의 할 문자열 교체 토큰이 "{}"입니다. 이것은 이전에 생성 한 "%"인 교체 문자열 토큰과 정확히 동일하게 작동합니다.
find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}
우리는 확인할 수 있습니다 ls
. 디렉토리에 남아있는 유일한 파일은 "* .sh"검색 패턴과 일치하는 파일입니다.
ls -l
Xargs로 아카이브 파일 만들기
사용할 수있다 find
파일을 검색하고 전달 xargs
에 tar
, 아카이브 파일을 만듭니다.
현재 디렉토리에서 검색하겠습니다. 검색 패턴은 "* .page"이므로 ".page"파일을 찾습니다.
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz
아카이브 파일이 생성되면 파일이 예상대로 나열됩니다.
데이터 중재자
때로는 물건을 쌓을 때 약간의 비계가 필요합니다. xargs
정보를 펌핑 할 수있는 명령과 정보를 받아들이도록 구축되지 않은 명령 사이의 간격을 메 웁니다.
양자 모두 xargs
과 find
엄청난 수의 옵션이 있습니다. 자세한 내용은 매뉴얼 페이지를 확인하는 것이 좋습니다.