Linux에서 xargs 명령을 사용하는 방법

0
2548
랩탑의 Linux 터미널 프롬프트
Fatmawati Achmad Zaenuri / 셔터 스톡

일부 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

터미널 창에서 v

현재 디렉토리의 쉘 스크립트 파일이 나열됩니다.

터미널 창에서 ls 출력

예상대로 단일 열을 얻습니다. 우리가 그것을 통해 파이프 xargs 우리는 무엇을 얻습니까?

ls -1 ./*.sh | xargs

ls -1 ./*.sh | 터미널 창에서 xargs

출력은 하나의 긴 텍스트 스트림으로 터미널 창에 기록됩니다.

터미널 창에서 xargs를 통해 파이프 연결

이 기능은 xargs 다른 명령으로 매개 변수를 공급

wc와 함께 xargs 사용

사용할 수있다 xargs 쉽게 wc 여러 파일에서 단어, 문자 및 줄을 세십시오.

ls *.page | xargs wc

ls * .page | 터미널 창에서 xargs wc

이것이 일어나는 일입니다.

  • ls * .page 파일을 나열하고 목록을 xargs.
  • xargs 파일 이름을 wc.
  • wc 파일 이름을 마치 명령 줄 매개 변수로받은 것처럼 처리합니다.

터미널 창의 wc 출력

각 파일에 대한 통계는 전체 합계와 함께 표시됩니다.

확인과 함께 xargs 사용

우리는 사용할 수 있습니다 -p 가지고있는 (대화식) 옵션 xargs 계속 진행할 수 있다는 확인 메시지를 표시합니다.

파일 이름 문자열을 touch을 통해 xargs, touch 우리를 위해 파일을 만들 것입니다.

echo 'one two three' | xargs -p touch

에코 '하나 둘 셋'| 터미널 창에서 xargs -p touch

실행될 명령이 표시되고 xargs “y”또는“Y”또는“n”또는“N”을 입력하고 Enter를 눌러 응답 할 때까지 기다립니다.

Enter 키만 누르면 “n”으로 처리됩니다. “y”또는 “Y”를 입력 한 경우에만 명령이 실행됩니다.

터미널 창에서 확인을 요청하는 xargs

우리는“y”를 누르고 Enter를 눌렀습니다. 사용할 수있다 ls 파일이 작성되었는지 확인하십시오.

ls one two three

터미널 창에서 ls 출력

여러 명령으로 xargs 사용

여러 명령을 사용할 수 있습니다 xargs 를 사용하여 -I (초기 인수) 옵션.

이 옵션은 “대체 문자열”을 정의합니다. replace-string에 대한 토큰이 명령 행에 나타날 때마다 제공된 값 xargs 삽입됩니다.

사용합시다 tree 현재 디렉토리에서 서브 디렉토리를 보도록 명령하십시오. 그만큼 -d (디렉토리) 옵션 원인 tree 파일을 무시하고 디렉토리에 대해서만보고합니다.

tree -d

터미널 창에서 트리 -d

“images”라는 단일 하위 디렉토리가 있습니다.

“directories.txt”라는 파일에는 만들려는 일부 디렉토리의 이름이 있습니다. 우리는 내용을 사용하여 볼 수 있습니다 cat.

cat directories.txt

터미널 창에서 catdirectory.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 명령은 디렉토리를 만듭니다.

고양이 directory.txt | xargs -I % sh -c '에코 %; 터미널 창에서 mkdir % '

디렉토리가 하나씩 나열됩니다.

터미널 창에서 xargs 출력

사용할 수있다 tree 디렉토리가 작성되었는지 확인하기 위해 한 번 더.

tree -d

터미널 창의 트리에서 출력

여러 위치에 파일 복사

사용할 수있다 xargs 단일 명령으로 파일을 여러 위치에 복사 할 수 있습니다.

우리는 두 디렉토리의 이름을 xargs 입력 매개 변수로. 우리는 말할 것이다 xargs 한 번에이 매개 변수 중 하나만 작업중인 명령에 전달합니다.

이 경우 명령은 cp. 효과는 전화하는 것입니다 cp 두 개의 디렉토리 중 하나를 명령 행 매개 변수로 사용하여 매번 두 번. 그만큼 xargs 이를 가능하게하는 매개 변수는 -n (최대 번호) 옵션. 이것을 하나로 설정하겠습니다.

우리는 또한 -v (자세한) 옵션 cp 무슨 일이 일어나고 있는지보고합니다.

echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page

echo ~ / 백업 / ~ / Documents / page-files / | 터미널 창에서 xargs -n 1 cp -v ./*.page

파일은 한 번에 한 디렉토리 씩 두 디렉토리에 복사됩니다. cp 각 파일 복사 작업을보고하여 파일이 발생하는 것을 확인할 수 있습니다.

터미널 창에서 xargs 및 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). “{}”은 각 파일 이름으로 대체됩니다.

찾기 . -name "* .png"-type f -print0 | 터미널 창에서 xargs -0 rm -v -rf "{}"

모든 하위 디렉토리가 검색되고 검색 패턴과 일치하는 파일이 삭제됩니다.

터미널 창에서 rm 출력

중첩 된 디렉토리 제거

중첩 된 서브 디렉토리 세트를 제거하려고한다고 가정하십시오. tree 우리가 그들을 보자.

tree -d

터미널 창에서 트리 -d

find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"

이 명령은 find를 사용하여 현재 디렉토리 내에서 재귀 적으로 검색합니다. 검색 대상은 “level_one”이라는 디렉토리입니다. 디렉토리 이름이 전달됩니다 xargsrm.

찾기 . -name "level_one"-type d printo | 터미널 창에서 xargs -o rm -v -rf "{}"

이 명령과 이전 명령 사이의 중요한 변경 사항은 검색어가 최상위 디렉토리의 이름이며 -type d 알려줍니다 find 파일이 아닌 디렉토리를 찾습니다.

터미널 창에서 find 및 xargs 및 rm의 출력

각 디렉토리의 이름은 제거 될 때 인쇄됩니다. 확인할 수있다 tree :

tree -d

터미널 창에서 트리 -d

중첩 된 모든 하위 디렉토리가 삭제됩니다.

하나의 파일 유형을 제외한 모든 파일 삭제

사용할 수있다 find, xargsrm 하나의 유형을 제외하고 모든 파일을 삭제합니다. 약간 반 직관적이지만 원하는 파일 형식의 이름을 제공합니다. 유지삭제하려는 이름이 아닙니다.

그만큼 -not 옵션은 말한다 find 파일의 이름을 반환 하지마 검색 패턴과 일치합니다. 우리는 -I (초기 인수) 옵션 xargs 한 번 더. 이번에 우리가 정의하고있는 대치 문자열 토큰은 “{}”입니다. 이것은 이전에 생성 한 replace-string 토큰과 정확히 동일하게 작동하며 이는“%”입니다.

find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}

찾기 . -type f -not-이름 "* .sh"-print0 | 터미널 창에서 xargs -0 -I {} rm -v {}

확인할 수있다 ls. 디렉토리에 남은 파일은“* .sh”검색 패턴과 일치하는 파일입니다.

ls -l

터미널 창에서 ls의 출력

Xargs를 사용하여 아카이브 파일 작성

사용할 수있다 find 파일을 검색하고 통과 xargstar, 보관 파일을 만듭니다.

현재 디렉토리에서 검색하겠습니다. 검색 패턴은“* .page”이므로“.page”파일을 찾습니다.

find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz

찾기 ./-이름 "* .page"-type f -print0 | 터미널 창에서 xargs -0 -tar -cvzf page_files.tar.gz

아카이브 파일이 작성 될 때 파일이 예상대로 나열됩니다.

터미널 창에서 tar 출력

데이터 중재자

때로는 물건을 쌓을 때 작은 비계가 필요합니다. xargs 정보를 펌핑 할 수있는 명령과 정보를 받아들이지 않는 명령 사이의 간격을 메 웁니다.

양자 모두 xargsfind 많은 옵션이 있습니다. 자세한 내용은 해당 매뉴얼 페이지를 참조하십시오.