"찾기"및 "위치 찾기"에 대한 빠른 대안?


22

"find"and locate "를 사용하여 프로젝트에서 소스 파일을 검색하려고하지만 실행 시간이 오래 걸립니다. 모르는 이러한 프로그램에 대한 빠른 대안 또는 성능 속도를 높일 수있는 방법이 있습니까? 이 프로그램들 중?


2
locatefind디렉토리 목록을 읽어야 하지만 사전 구축 된 색인 (최신 경고는 최신 상태를 유지해야 함)을 사용한다는 점을 고려하면 이미 충분히 빠릅니다 .
afrazier

2
어느 위치를 사용하고 있습니까? mlocate는 먼 길로 이동하는 것보다 빠릅니다 (설치 한 패키지가 무엇이든 명령이 여전히 있으므로 패키지 관리자를 확인하십시오)
Paul

@benhsu, find /usr/src -name fprintf.cOpenBSD 데스크탑 컴퓨터에서 실행하면 10 초 이내에 해당 소스 파일의 위치를 ​​반환합니다. locate fprintf.c | grep '^/usr/src.*/fprintf.c$'1 초 안에 다시 들어옵니다. 당신은 어떻게 사용합니까 "실행하는 데 시간이 오래"의 당신의 정의 무엇 findlocate?
Kusalananda

@Paul, 나는 mlocate를 사용하고 있습니다.
benhsu

@KAK, 찾기 / 위치 출력을 사용하여 emacs에서 파일을 열고 싶습니다. 내가 생각하는 유스 케이스는 파일을 편집하고 파일 이름 (또는 파일 이름과 일치하는 일부 정규 표현식)을 emacs에 입력하고 emacs는 찾기 / 찾기를 사용하여 일치하는 파일 목록을 가져 오는 것입니다. 대화식 (1 초 미만)이 될 수있을 정도로 빠른 응답 시간을 원합니다. $ HOME에 약 3 백만 개의 파일이 있는데, 내가 할 수있는 한 가지는 find 명령이 일부 파일을 제거하는 것입니다.
benhsu

답변:


16

프로젝트에서 소스 파일 검색

더 간단한 명령을 사용하십시오

일반적으로 프로젝트의 소스는 한곳에있을 수 있습니다. 아마도 2 개 또는 3 개 이하의 깊이로 중첩 된 몇 개의 하위 디렉토리에있을 수 있습니다.

(cd /path/to/project; ls *.c */*.c */*/*.c)

프로젝트 메타 데이터 활용

C 프로젝트에는 일반적으로 Makefile이 있습니다. 다른 프로젝트에서는 비슷한 것이있을 수 있습니다. 파일 목록 (및 해당 위치)을 추출하여이 정보를 사용하여 파일을 찾는 스크립트를 작성하는 빠른 방법이 될 수 있습니다. "sources"스크립트가있어서와 같은 명령을 작성할 수 있습니다 grep variable $(sources programname).

찾기 속도

가능한 find / …경우 사용 find /path/to/project …하는 대신 적은 수의 장소를 검색 하십시오. 선택 기준을 최대한 단순화하십시오. 더 효율적인 경우 파이프 라인을 사용하여 일부 선택 기준을 연기하십시오.

또한 검색 깊이를 제한 할 수 있습니다. 나를 위해, 이것은 '찾기'의 속도를 많이 향상시킵니다. -maxdepth 스위치를 사용할 수 있습니다. 예를 들어 '-maxdepth 5'

찾기 속도

관심있는 위치를 색인으로 작성하십시오. 매뉴얼 페이지를 읽고 작업에 적합한 옵션을 사용하십시오.

   -U <dir>
          Create slocate database starting at path <dir>.

   -d <path>
          --database=<path> Specifies the path of databases to search  in.


   -l <level>
          Security  level.   0  turns  security checks off. This will make
          searchs faster.   1  turns  security  checks  on.  This  is  the
          default.

검색 할 필요가 없습니다

당신이 무언가를 말하거나 듣지 못한 곳을 잊었 기 때문에 검색하고있을 수 있습니다. 전자의 경우, 메모 (문서)를 작성하십시오. 협약, 표준 및 일관성은 많은 도움이 될 수 있습니다.


10

RedGrittyBrick의 답변 중 "스피킹 속도 찾기"부분을 사용했습니다. 더 작은 db를 만들었습니다.

updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"

그런 다음 지적 locate했다.locate -d /home/benhsu/ben.db


6

내가 사용하는 전술은 다음 -maxdepth과 같이 옵션 을 적용하는 것입니다 find.

find -maxdepth 1 -iname "*target*"

찾고있는 것을 찾거나 피곤해 보일 때까지 심도를 높이면서 반복하십시오. 처음 몇 번의 반복은 즉시 돌아올 것입니다.

이렇게하면 찾고있는 것이 계층 구조의 기본 근처에있을 때 방대한 하위 트리의 깊이를 살펴 보는 데 시간을 낭비하지 않아도됩니다.


이 프로세스를 자동화하는 스크립트 예는 다음과 같습니다 (원하는 것을 볼 때 Ctrl-C).

(
TARGET="*target*"
for i in $(seq 1 9) ; do
   echo "=== search depth: $i"
   find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)

관련된 고유 중복성 (각 패스는 이전 패스에서 처리 된 폴더를 통과해야 함)은 디스크 캐싱을 통해 크게 최적화됩니다.

find이 검색 순서가 내장 기능으로 없는 이유는 무엇 입니까? 중복 통과가 허용되지 않는다고 가정하면 구현이 복잡하거나 불가능하기 때문일 수 있습니다. -depth옵션 의 존재는 가능성을 암시하지만 슬프게도 ...


1
... 따라서 "폭 우선"검색을 수행합니다.
nobar

3

또 다른 쉬운 해결책은 최신 확장 쉘 글 로빙을 사용하는 것입니다. 사용하려면:

  • bash : shopt -s globstar
  • ksh : 설정 -o globstar
  • zsh : 이미 활성화

그런 다음 최상위 소스 디렉토리에서 다음과 같은 명령을 실행할 수 있습니다.

# grep through all c files
grep printf **/*.c

# grep through all files
grep printf ** 2>/dev/null

이것은 모든 서브 디렉토리를 재귀 적으로 검색하며 매우 빠르다는 장점이 있습니다.


3

실버 검색 자

수많은 소스 코드 파일 의 내용 을 매우 빠르게 검색하는 데 유용 할 수 있습니다 . 그냥 입력하십시오 ag <keyword>. 여기 내 출력 중 일부 apt show silversearcher-ag:

나는 보통 다음과 함께 사용합니다 :

-G --file-search-regex PATTERN 이름이 PATTERN과 일치하는 파일 만 검색하십시오.

ag -G "css$" important

스크린 샷


1
ripgrep의 algorythm 빠르게 silversearch보다는 주장이며, 또한 명예 .gitignore파일과 건너 뜀을 .git, .svn, .hg... 폴더.
ccpizza

@ccpizza 그래서? Silver Searcher.gitignore기본적으로 숨겨진 파일과 이진 파일을 존중 하고 무시합니다. 또한 더 많은 기고자, Github의 더 많은 별 (14700 vs 8300)이 있으며 이미 시장 배포판을 대체하고 있습니다. 업데이트 된 신뢰할 수있는 타사 소스 비교를 제공하십시오. 그럼에도 불구하고 ripgrep훌륭한 소프트웨어로 보입니다.
Pablo A

알아 둘만 한! 나는 ripgrep어떤 방식 으로든 저자와 제휴하지 않고 다른 요구 사항에 맞지 않아 다른 옵션 검색을 중단했습니다.
ccpizza

은색 검색도 존중 .gitignore합니다. 그것은 rg절대적으로 훌륭합니다. 먼저 유니 코드를 지원합니다. 내 경험에 따르면 (YMMV) rg보다 적어도 두 배 빠른 속도로 agRust의 정규식 파서가 원인이라고 생각합니다 ag. rg결정적 출력을 제공 할 수 있지만 (기본적으로는 아님), ag화이트리스트 만 할 수 있는 파일 형식을 블랙 리스트에 올릴 수 있으며 크기에 따라 파일을 무시할 수 있습니다 (바이 바이 로그). 여러 줄 ag일치가 필요한 경우 에도 여전히 사용 rg합니다.
Pellmeister

2

대체품을 찾으 려면 fd를 확인하십시오 . 원래 find 명령보다 더 간단하고 직관적 인 인터페이스를 가지고 있으며 약간 더 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.