2개의 키워드가 포함된 모든 파일 및/또는 경로를 찾는 안정적인 방법은 무엇입니까?

2개의 키워드가 포함된 모든 파일 및/또는 경로를 찾는 안정적인 방법은 무엇입니까?

나는하고 있었다

find . -iname '*sitesearch*' | grep demo

파일이 이어야 한다는 것을 알고 있는데 some/path/SiteSearch/demo/SiteSearch.html누군가가 파일을 로 넣어서 some/path/SiteSearch/demo/index.html파일을 찾을 수 없다는 것이 밝혀졌습니다.

검색을 수행하는 더 좋은 방법이 있습니까?

예를 들어, 이 예에서는

find . -iname '*demo*' | grep -i sitesearch

그것을 찾을 것입니다. 하지만 항상 그것이 어떤 가능성인지 생각하고 어떤 패턴을 사용해야 할지 파악하고 싶지는 않습니다. 파일과 경로에 이 두 키워드가 모두 있을 때마다 인쇄할 수 있는 방법을 원합니다. 예를 들어, ls모든 파일에 대한 각 줄의 전체 경로를 제공하는 방법이 있다면 다음과 같이 할 수 있습니다.

ls --some-flags | grep -i demo | grep -i sitesearch

아니면 다른 방법/더 나은 방법일 수도 있습니다.

답변1

에서는 두 패턴(또는 보다 일반적으로 여러 조건)을 결합할 수 있습니다 find.

find . -ipath '*sitesearch*' -ipath '*demo*'

또는 정규식 구문을 선호하는 경우

find . -iregex '.*sitesearch.*' -iregex '.*demo.*'

" ls각 줄의 전체 경로"(여기서 분명히 필요한 디렉토리를 재귀적으로 탐색하는 것 포함)는 입니다 find. 실행할 수는 있지만 find | grep -i demo | grep -i sitesearch모든 작업을 수행하는 것이 find아마도 훨씬 더 빠를 것입니다 .

이 작업을 자주 수행하는 경우 함수로 만들 수 있습니다( ~/.kshrc또는 ~/.bashrc안에 넣습니다 ~/.zshrc).

findallof () {
  typeset -a pred
  pred=(.)
  typeset x
  for x do
    pred=("${pred[@]}" -ipath "*$x*")
  done
  find "${pred[@]}"
}

또한 다음을 사용하여 이름으로 파일을 검색할 수 있습니다.locate(Linux에서도 여러 구현이 있으므로 시스템의 매뉴얼 페이지를 확인하십시오.)

locate -i sitesearch | grep -i demo

locate이는 인덱스가 쿼리되기 때문에 큰 디렉터리 트리를 검색하는 것보다 빠릅니다 (비록 대소문자를 구분하지 않는 검색은 그다지 빠르지 않은 경향이 있음). 그러나 인덱스는 일반적으로 밤에만 다시 작성되므로 오늘 생성된 파일은 표시되지 않습니다. 공개적으로 읽을 수 있는 디렉토리에 없는 파일은 구현에 따라 색인화될 수도 있고 그렇지 않을 수도 있습니다( /usr/bin/locatesetuid 루트 바이너리인지 확인하십시오. 그렇다면 개인 파일은 색인화되고 locate명령은 액세스할 수 있는 파일만 표시합니다).

관련 정보