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

일부 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가 항상 한 줄의 출력을 생성하는 방법을 보여줄 수 있습니다.

ls와 함께 -1(한 줄에 하나의 파일 나열) 옵션을 사용하면 파일 이름의 단일 열.

ls -1 ./*.sh

이것은 현재 디렉토리에 있는 쉘 스크립트 파일을 나열합니다.

  Raspberry Pi 4에서 Manjaro를 사용하는 방법

예상대로 단일 열이 표시됩니다. xargs를 통해 파이프하면 무엇을 얻을 수 있습니까?

ls -1 ./*.sh | xargs

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

xargs가 매개변수를 다른 명령에 공급하는 것은 바로 이 기능입니다.

wc와 함께 xargs 사용

xargs를 사용하여 wc를 쉽게 계산할 수 있습니다. 단어, 문자 및 라인 여러 파일에서.

ls *.page | xargs wc

다음과 같은 일이 발생합니다.

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

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

확인과 함께 xargs 사용

-p(대화식) 옵션을 사용하여 xargs가 계속 진행할 수 있다는 확인 메시지를 표시하도록 할 수 있습니다.

xargs를 통해 touch에 파일 이름 문자열을 전달하면 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 사용

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

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

tree 명령을 사용하여 현재 디렉토리에서 하위 디렉토리를 살펴보겠습니다. -d(디렉토리) 옵션은 트리가 파일을 무시하고 디렉토리에 대해서만 보고하도록 합니다.

tree -d

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

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

cat directories.txt

이것을 xargs의 입력 데이터로 사용할 것입니다. 우리가 할 명령은 다음과 같습니다.

cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

이것은 다음과 같이 나뉩니다.

cat directory.txt |: 이것은 directrories.txt 파일의 내용(모든 새 디렉토리 이름)을 xargs로 푸시합니다.
xargs -I %: “%” 토큰으로 “replace-string”을 정의합니다.
sh -c: 새 서브쉘을 시작합니다. -c(명령)는 명령줄에서 명령을 읽도록 쉘에 지시합니다.
‘에코 %; mkdir %’: 각 “%” 토큰은 xargs에 의해 전달된 디렉토리 이름으로 대체됩니다. echo 명령은 디렉토리 이름을 인쇄합니다. mkdir 명령은 디렉토리를 생성합니다.

  Photoshop에서 레이어를 병합하는 방법

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

트리를 한 번 더 사용하여 디렉토리가 생성되었는지 확인할 수 있습니다.

tree -d

여러 위치에 파일 복사

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

두 디렉토리의 이름을 입력 매개변수로 xargs에 파이프할 것입니다. xargs가 작업 중인 명령에 한 번에 이러한 매개변수 중 하나만 전달하도록 지시합니다.

이 경우 명령은 cp입니다. 따라서 결과는 두 디렉토리 중 하나를 명령줄 매개변수로 사용하여 매번 cp를 두 번 호출하는 것입니다. 이를 가능하게 하는 xargs 매개변수는 -n(최대 수) 옵션입니다. 우리는 이것을 하나로 설정할 것입니다.

또한 cp와 함께 -v(verbose) 옵션을 사용하여 무슨 일이 일어나고 있는지 보고합니다.

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

파일은 한 번에 한 디렉터리씩 두 디렉터리에 복사됩니다. cp는 각 파일 복사 작업을 보고하여 이러한 작업이 수행되는 것을 볼 수 있습니다.

중첩 디렉토리에서 파일 삭제

파일 이름에 공백과 개행 문자와 같은 이상한 문자가 있는 경우 xargs는 이를 올바르게 해석할 수 없습니다. -0(null terminator) 옵션을 사용하여 이 문제를 극복할 수 있습니다. 이것은 xargs가 파일 이름의 최종 구분 기호로 null 문자를 사용하도록 지시합니다.

이 예제에서는 find를 사용할 것입니다. 찾기에 대한 자체 옵션이 있습니다. 공백 처리 파일 이름에 이상한 문자가 있습니다. -print0(전체 이름, null 문자) 옵션입니다.

find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"

이것은 다음과 같이 나뉩니다.

찾기 . -name “*.png”: find는 현재 디렉토리 “.”에서 검색합니다. 파일인 “*.png”와 이름이 일치하는 개체의 경우(유형 -f).
-print0: 이름은 null 문자로 종료되고 공백 및 이상한 문자는 처리됩니다.
xargs -0: xargs는 파일 이름도 null로 끝나는 것으로 간주하고 공백과 이상한 문자로 인해 문제가 발생하지 않습니다.
rm -v -rf “{}”: rm은 장황하고 무슨 일이 일어나고 있는지 보고합니다(-v). 재귀적(-r)이고 중첩된 하위 디렉터리를 살펴보고 프롬프트(-f) 없이 파일을 제거합니다. “{}”는 각 파일 이름으로 대체됩니다.

  미디어 파일의 자막을 찾는 방법

찾기 .  -이름

모든 하위 디렉토리를 검색하고 검색 패턴과 일치하는 파일을 삭제합니다.

중첩 디렉토리 제거

중첩된 하위 디렉터리 집합을 제거하려고 한다고 가정해 보겠습니다. 나무는 우리가 그들을 볼 수 있도록 할 것입니다.

tree -d

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

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

찾기 .  -이름

이 명령과 이전 명령 사이의 유일한 중요한 변경 사항은 검색어가 최상위 디렉토리의 이름이고 -type d가 find에 파일이 아닌 디렉토리를 찾도록 지시한다는 것입니다.

각 디렉토리의 이름은 제거될 때 인쇄됩니다. 우리는 나무로 확인할 수 있습니다:

tree -d

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

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

find, xargs 및 rm을 사용하여 유지하려는 한 유형을 제외한 모든 파일을 삭제할 수 있습니다. 다소 직관적이지 않지만 삭제하려는 파일 유형의 이름이 아니라 유지하려는 파일 유형의 이름을 제공합니다.

-not 옵션은 find가 검색 패턴과 일치하지 않는 파일의 이름을 반환하도록 지시합니다. xargs와 함께 -I(초기 인수) 옵션을 다시 한 번 사용하고 있습니다. 이번에는 우리가 정의하는 교체 문자열 토큰이 “{}”입니다. 이것은 이전에 생성한 “%”인 문자열 교체 토큰과 정확히 동일하게 작동합니다.

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

찾기 .  -유형 f -not - 이름

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 둘 다 엄청난 수의 옵션이 있습니다. 자세한 내용은 매뉴얼 페이지를 확인하는 것이 좋습니다.