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

0
405

빨간색 배경의 Linux 명령줄 인터페이스
팻마와티 아흐마드 자누리/Shutterstock

리눅스 find 명령은 파일과 디렉토리를 검색하는 데 유용합니다. 그러나 추가 처리를 위해 검색 결과를 다른 프로그램에 전달할 수도 있습니다. 우리는 방법을 보여줍니다.

Linux 찾기 명령

리눅스 find 명령은 강력하고 유연합니다. 파일 이름뿐만 아니라 다양한 기준을 사용하여 파일과 디렉토리를 검색할 수 있습니다. 예를 들어 빈 파일, 실행 파일 또는 특정 사용자가 소유한 파일을 검색할 수 있습니다. 액세스 또는 수정된 시간으로 파일을 찾고 나열할 수 있으며 정규식 패턴을 사용할 수 있으며 기본적으로 재귀적이며 명명된 파이프(FIFO 버퍼)와 같은 의사 파일과 함께 작동합니다.

모든 Linux의 검색 명령을 사용하는 방법

관련된모든 Linux의 검색 명령을 사용하는 방법

이 모든 것이 매우 유용합니다. 겸손한 find 명령은 실제로 약간의 힘을 제공합니다. 하지만 그 힘을 활용하고 상황을 다른 수준으로 끌어올리는 방법이 있습니다. 우리가 출력을 취할 수 있다면 find 명령을 사용하고 자동으로 다른 명령의 입력으로 사용하면 발견한 파일과 디렉터리에 무언가를 발생시킬 수 있습니다.

한 명령의 출력을 다른 명령으로 연결하는 원리는 Unix 파생 운영 체제의 핵심 특성입니다. 프로그램이 한 가지 작업을 수행하고 잘 수행하도록 하고 그 출력이 아직 작성되지 않은 프로그램이라 할지라도 다른 프로그램의 입력이 될 수 있다고 기대하는 설계 원칙은 종종 “유닉스 철학”으로 설명됩니다. 그러나 다음과 같은 일부 핵심 유틸리티는 mkdir, 파이프 입력을 허용하지 않습니다.

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

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

이 단점을 보완하기 위해 xargs 명령을 사용하여 파이프 입력을 분류하고 해당 명령에 대한 명령줄 매개변수인 것처럼 다른 명령에 이를 공급할 수 있습니다. 이것은 직선 배관과 거의 동일한 결과를 얻습니다. 쉘 확장 및 파일 이름 글로빙에 예기치 않은 차이가 있을 수 있기 때문에 “거의 동일한” 것이지 “정확히 동일한” 것은 아닙니다.

xargs로 찾기 사용

우리는 사용할 수 있습니다 find ~와 함께 xargs 발견된 파일에 대해 수행된 일부 작업. 이것은 해결해야 할 긴 방법이지만 다음에서 찾은 파일을 제공할 수 있습니다. find ~ 안으로 xargs , 그런 다음 파이프 tar 해당 파일의 아카이브 파일을 생성합니다. 많은 도움말 시스템 PAGE 파일이 있는 디렉토리에서 이 명령을 실행합니다.

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

find의 출력을 xargs를 통해 tar로 파이핑

명령은 다양한 요소로 구성됩니다.

  • ./ -이름 “*.page” 찾기 -type f -print0: 찾기 작업은 현재 디렉토리에서 시작하여 “*.page” 검색 문자열과 일치하는 파일을 이름으로 검색합니다. 디렉토리는 특히 파일만 찾도록 지시하기 때문에 나열되지 않습니다. -type f. 그만큼 print0 주장은 말한다 find 공백을 파일 이름의 끝으로 취급하지 않습니다. 이는 공백이 있는 파일 이름이 올바르게 처리됨을 의미합니다.
  • xargs -o: -0 인수 xargs 공백을 파일 이름의 끝으로 취급하지 않습니다.
  • tar -cvzf page_files.tar.gz: 이것은 명령입니다 xargs 에서 파일 목록을 제공할 것입니다. find 에게. tar 유틸리티는 “page_files.tar.gz”라는 아카이브 파일을 생성합니다.

우리는 사용할 수 있습니다 ls 우리를 위해 생성된 아카이브 파일을 보려면

ls *.gz

find의 출력을 xargs를 통해 tar로 파이핑하여 생성된 아카이브 파일

아카이브 파일이 생성됩니다. 이것이 작동하려면 모든 파일 이름을 tar 일괄적으로, 무슨 일이 있었는지. 모든 파일 이름은 끝 부분에 태그가 지정되었습니다. tar 명령을 매우 긴 명령줄로 사용합니다.

모든 파일 이름에서 한 번에 최종 명령을 실행하거나 파일 이름당 한 번 호출하도록 선택할 수 있습니다. 출력을 파이핑하여 차이를 아주 쉽게 볼 수 있습니다. xargs 라인 및 문자 카운팅 유틸리티에 wc.

이 명령은 모든 파일 이름을 다음으로 파이프합니다. wc 한 번에. 효과적으로, xargs 에 대한 긴 명령줄을 구성합니다. wc 각 파일 이름과 함께.

find . -name "*.page" -type f -print0 | xargs -0 wc

한 번에 여러 파일 이름을 wc에 파이프

각 파일의 행, 단어 및 문자가 모든 파일의 합계와 함께 인쇄됩니다.

모든 파일에 대한 총계와 함께 많은 파일에 대한 단어 수 통계

우리가 사용하는 경우 xarg‘에스 -I (replace string) 옵션을 선택하고 대체 문자열 토큰을 정의합니다. 이 경우 ” {}“- 토큰은 최종 명령에서 각 파일 이름으로 차례로 대체됩니다. 이것은 의미 wc 각 파일에 대해 한 번씩 반복적으로 호출됩니다.

find . -name "*.page" -type f -print0 | xargs -0 -I "{}" wc "{}"

대체 문자열을 사용하여 파일 이름을 한 번에 하나씩 화장실에 보내기

출력이 잘 정렬되지 않습니다. 각 호출 wc 단일 파일에서 작동하므로 wc 출력을 정렬할 항목이 없습니다. 출력의 각 줄은 독립적인 텍스트 줄입니다.

wc를 여러 번 호출한 결과

왜냐하면 wc 한 번에 여러 파일에서 작동할 때만 총계를 제공할 수 있으며 요약 통계를 얻지 못합니다.

찾기 -exec 옵션

그만큼 find 명령에는 반환하는 파일 이름에 대한 추가 처리를 수행하기 위해 외부 프로그램을 호출하는 내장 메서드가 있습니다. 그만큼 -exec (실행) 옵션은 다음과 유사하지만 다른 구문을 가집니다. xargs 명령.

find . -name "*.page" -type f -exec wc -c "{}" ;

-exec를 사용하여 단일 파일 이름을 화장실로 보내기

이것은 일치하는 파일의 단어를 계산합니다. 명령은 이러한 요소로 구성됩니다.

  • 찾기 .: 현재 디렉토리에서 검색을 시작합니다. 그만큼 find 명령은 기본적으로 재귀적이므로 하위 디렉터리도 검색됩니다.
  • -이름 “*.페이지”: “*.page” 검색 문자열과 일치하는 이름을 가진 파일을 찾고 있습니다.
  • -유형 f: 디렉토리가 아닌 파일만 찾습니다.
  • -exec 화장실: 실행하겠습니다. wc 검색 문자열과 일치하는 파일 이름에 대한 명령입니다.
  • -w: 명령에 전달하려는 모든 옵션은 명령 바로 다음에 배치해야 합니다.
  • “{}”: “{}” 자리 표시자는 각 파일 이름을 나타내며 매개변수 목록의 마지막 항목이어야 합니다.
  • ;: 세미콜론 “;” 매개변수 목록의 끝을 나타내는 데 사용됩니다. 쉘이 해석하지 않도록 백슬래시 “”로 이스케이프해야 합니다.

해당 명령을 실행하면 다음과 같은 출력이 표시됩니다. wc. 그만큼 -c (바이트 수)는 출력을 각 파일의 바이트 수로 제한합니다.

-exec를 사용하여 많은 단일 파일 이름을 wc로 보낸 결과

보시다시피 합계가 없습니다. 그만큼 wc 명령은 파일 이름당 한 번 실행됩니다. 더하기 기호 “로 대체하여+” 종료 세미콜론 “;“우리는 변경할 수 있습니다 -exec의 동작은 한 번에 모든 파일에서 작동합니다.

find . -name "*.page" -type f -exec wc -c "{}" +

-exec를 사용하여 모든 파일 이름을 한 번에 wc로 보내기

요약 총계와 모든 파일이 wc 하나의 긴 명령줄로.

한 번에 모든 파일 이름을 wc로 보내기 위해 -exec를 사용한 출력

exec 실제로 exec를 의미합니다.

그만큼 -exec (실행) 옵션은 현재 셸에서 명령을 실행하여 실행하지 않습니다. Linux의 내장 exec를 사용하여 명령을 실행하고 현재 프로세스(당신의 셸)를 명령으로 바꿉니다. 따라서 실행되는 명령은 셸에서 전혀 실행되지 않습니다. 셸이 없으면 와일드카드의 셸 확장을 얻을 수 없으며 별칭 및 셸 기능에 액세스할 수 없습니다.

이 컴퓨터에는 이라는 쉘 함수가 정의되어 있습니다. words-only. 이것은 파일의 단어만 계산합니다.

function words-only () 
{ 
  wc -w $1
}
Linux에서 별칭 및 셸 함수를 만드는 방법

관련된Linux에서 별칭 및 셸 함수를 만드는 방법

이상한 기능은 아마도 “words-only”가 “wc -w”보다 입력하는 데 훨씬 더 길지만 적어도 다음을 위한 명령줄 옵션을 기억할 필요가 없다는 것을 의미합니다. wc. 다음과 같이 테스트할 수 있습니다.

words-only user_commands.pages

쉘 함수를 사용하여 단일 파일의 단어 수 계산

정상적인 명령줄 호출에서는 잘 작동합니다. 다음을 사용하여 해당 함수를 호출하려고 하면 find‘에스 -exec 옵션을 선택하면 실패합니다.

find . -name "*.page" -type f -exec words-only "{}" ;

-exec와 함께 쉘 기능을 사용하려고 합니다.

그만큼 find 명령이 쉘 기능을 찾을 수 없고, -exec 작업이 실패합니다.

-exec가 쉘에서 실행되지 않기 때문에 쉘 기능을 찾지 못함

이것을 극복하기 위해 우리는 할 수 있습니다 find Bash 셸을 시작하고 나머지 명령줄을 셸에 대한 인수로 전달합니다. 명령줄을 큰따옴표로 묶어야 합니다. 즉, “{}” 문자열을 바꿉니다.

실행하기 전에 find 명령을 사용하여 쉘 함수를 내보내야 합니다. -f (함수로) 옵션:

export -f words-only
find . -name "*.page" -type f -exec bash -c "words-only "{}"" ;

find를 사용하여 쉘을 실행하여 쉘 기능을 실행하십시오.

예상대로 실행됩니다.

새 쉘에서 호출되는 쉘 함수

파일 이름을 두 번 이상 사용

여러 명령을 함께 연결하려면 그렇게 할 수 있으며 “{}” 각 명령의 문자열을 바꿉니다.

find . -name "*.page" -type f -exec bash -c "basename "{}" && words-only "{}"" ;

만약 우리가 cd “pages” 디렉토리에서 한 단계 위로 올라가 해당 명령을 실행합니다. find 재귀적으로 검색하기 때문에 여전히 PAGE 파일을 검색합니다. 파일 이름과 경로는 words-only 기능은 이전과 동일합니다. 순전히 사용을 시연하는 이유로 -exec 두 개의 명령으로 basename 경로 없이 파일 이름을 확인하는 명령입니다.

둘 다 basename 명령과 words-only 쉘 함수는 “를 사용하여 파일 이름을 전달합니다.{}” 문자열을 바꿉니다.

동일한 -exec 호출에서 basename 명령 및 단어 전용 셸 함수 호출

코스용 말

명령을 한 번 호출하고 모든 파일 이름을 한 번에 전달할 수 있는 명령을 반복적으로 호출하면 CPU 로드 및 시간 패널티가 있습니다. 그리고 명령을 실행할 때마다 새 셸을 호출하는 경우 오버헤드가 더 악화됩니다.

그러나 달성하려는 목표에 따라 다른 옵션이 없을 수도 있습니다. 상황에 필요한 방법이 무엇이든, Linux가 특정 요구에 맞는 옵션을 찾을 수 있을 만큼 충분한 옵션을 제공한다는 사실에 아무도 놀라지 않을 것입니다.