내 질문이 조금 이상하게 들릴 수도 있지만 오늘 아침에 다음 질문을 읽었습니다.
"에코"가 "터치"보다 훨씬 빠른 이유는 무엇입니까?
내장 함수의 개념을 완전히 이해하지만 동일한 예를 제시하는지 모르겠습니다.
#!/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
.
find
make는 결과를 반복하는 대신 명령을 실행합니다. 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
|매개변수를 찾는 방법 알아보기