쉘 스크립트에서 외부 바이너리를 캐시하는 것이 가능합니까?

쉘 스크립트에서 외부 바이너리를 캐시하는 것이 가능합니까?

내 질문이 조금 이상하게 들릴 수도 있지만 오늘 아침에 다음 질문을 읽었습니다.
"에코"가 "터치"보다 훨씬 빠른 이유는 무엇입니까?
내장 함수의 개념을 완전히 이해하지만 동일한 예를 제시하는지 모르겠습니다.

#!/bin/bash (or any other shell if it's possible in another)
for file in `find . -name "*.xml"`;
do 
   touch $file; 
done

touch프리로딩을 해서 사용할 때마다 포크할 필요 없이 빠르게 할 수는 없을까요 ?

답변1

실제로 커널은 실행 파일과 필요한 모든 파일(예: 라이브러리)을 RAM에 캐시합니다.

쉘이 아무것도 할 수 있는 방법은 없습니다. 외부 프로그램인 경우 실행이 필요합니다. Unices(Cygwin과 같은 UNIX 에뮬레이션 계층 제외)는 프로그램 로딩을 매우 효율적으로 만드는 경향이 있지만 내장 명령을 실행하는 것만큼 빠르지는 않습니다.

통화를 그룹화하여 시간을 절약할 수 있습니다 touch. 우선, 출력에 명령 대체를 사용하면 안 됩니다 find. 이는 장점이 전혀 없지만 몇 가지 단점이 있습니다.

  • 파일 이름에 공백이나 와일드카드가 포함되어 있으면 작동이 중단됩니다.
  • find디렉터리 트리 탐색을 먼저 완료한 다음 처리를 시작할 수 있기 때문에 속도가 느립니다 .
  • 저장을 위해 더 많은 메모리를 사용합니다 find.

findmake는 결과를 반복하는 대신 명령을 실행합니다. find이 용도로 설계되었습니다.

find . -name "*.xml" -exec touch {} \;

이제 touch한 번에 여러 파일을 처리할 수 있으므로 , \;로 바꾸면 +됩니다. touch배치 호출에는 가능한 한 많은 파일이 포함됩니다.

find . -name "*.xml" -exec touch {} +

쉘 스크립트 성능이 필요한 경우 대량의 데이터를 조작하지 않는 한 내장 명령이 항상 외부 명령보다 좋습니다. 예를 들어, sed한 줄의 텍스트가 있는 경우 셸의 문자열 처리 구성을 사용하는 것이 를 호출하는 것보다 훨씬 빠릅니다(인용 문제로 인한 오류 발생 가능성도 낮음). 반면 sed에 처리할 행이 수백만 개인 경우에는 기타 특수 외부 도구를 사용하세요.

새 파일을 생성하는 경우 사용 touch -- "$file": >"$file". 기존 파일의 날짜를 현재 시간으로 변경하는 바로가기는 없습니다.

셸에는 외부 명령으로 구현할 수 있는 몇 가지 내장 명령이 있지만 성능상의 이유로 이러한 명령은 내부 명령입니다. echo좋은 예입니다. 외부 명령이 손상되거나 프로세스 테이블이 가득 찬 등의 복구 상황에 사용할 수 있는 추가 내장 명령이 포함된 셸도 있습니다. 예를 들어 zsh는 다음과 같이 제공됩니다.zsh/files기준 치수mkdir및 등의 명령이 포함되어 있지만 포함 mv되지는 않습니다 touch.허리띠-touch내장된 것들이 있습니다 .

답변2

find . -name "*.xml" -print0 | xargs -0 touch

|매개변수를 찾는 방법 알아보기

관련 정보