디렉토리 / 파일 조합을 검색 할 수 있습니까?


12

ABC_MPSC라는 디렉토리에 프로그래밍 방식으로 배치 된 이미지 인 ABC.jpg를 찾아야합니다. 난 노력 했어:

cd /
find . -name "ABC_MPSC/ABC.jpg"

그러나 그것은 아무것도 반환하지 않습니다 (실제로 내가 찾고있는 특정 것이 어디에 있는지 알고 있으므로 그것이 존재한다는 것을 알고 있습니다). 수동으로 검색하지 않아도되는 find 명령이 있습니까?



2
또한 locate훨씬 빠르지 만 파일 updatedb을 마지막으로 실행할 때 파일이 이미 존재하는 경우에만 작동 합니다.
Simon Richter

답변:


17

있다 -path여기에 유용한 술어는 :

find . -path '*/ABC_MPSC/ABC.jpg'

POSIX의 설명 이 술어는 다음과 같습니다

1 차 경로는 현재 경로명이 패턴 일치 표기법에 설명 된 패턴 일치 표기법을 사용하여 패턴과 일치하면 true로 평가해야합니다. 파일 이름 확장에 사용 된 패턴의 추가 규칙은 확장이 아니라 일치하는 작업이므로 적용되지 않습니다.

당신의 이유 -name "ABC_MPSC/ABC.jpg"실패가 있기 때문이다 -name조건 :

현재 경로명의 기본 이름이 패턴과 일치하면 참으로 평가

다시 말해, 현재 파일 이름 -name디렉토리 를 볼 수없고 기본 파일 이름 자체 (예 : ABC.jpg) 만 볼 수 있습니다.


10

두 가지 방법 (을 사용하는-path 것 제외 ) :

  1. 디렉토리를 찾은 다음 파일을 감지하십시오.

    find / -type d -name 'ABC_MPSC' -exec test -f {}/ABC.jpg \; -print
    

    이것은에 의존하는 find확장 구현 {}이와 연결, 비록 발견 된 디렉토리의 현재 경로로 /ABC.jpg(이 아니에요 필요한 그렇게). 다음과 같이 쓸 수도 있습니다.

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. 파일을 찾은 다음 상위 디렉토리 이름을 확인하십시오.

    find / -type f -name 'ABC.jpg' -exec sh -c '
        case $(dirname "$1") in
            */ABC_MPSC) exit 0 ;;
            *) exit 1
        esac' sh {} \; -print
    

이 두 가지 대안 모두 -pathJeff가 보여주는 방식으로 사용 하는 것보다 느립니다 . 나는 그것들을 다른 것들에 적응시킬 수 있기 때문에 예제로 남겨두고 있습니다.

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