정규식을 사용하여 경로를 필터링하고 명령을 찾는 방법은 무엇입니까?

정규식을 사용하여 경로를 필터링하고 명령을 찾는 방법은 무엇입니까?

다음과 같은 디렉토리 세트가 있습니다.

/level1/user01/dir01
/level1/user01/dir02
/level1/user01/dir03
/level1/user01/dir04
/level1/user02/dir01
/level1/user02/dir02
/level1/user02/dir03
/level1/user02/dir04
/level1/user03/dir01
/level1/user03/dir02
/level1/user03/dir03
/level1/user03/dir04

find를 사용하여 각 사용자의 dir02 디렉토리에서 확장자가 .oz인 파일을 검색하고 싶습니다.

나는 사용할 수 있다

find /level1/ -name "*.oz"

하지만 dir02 디렉토리 내에서만 검색하고 싶습니다.

이건 작동하지 않아

find /level1/"[a-z][0-9]"/dir02 -name "*.oz"

답변1

첫 번째 인수에 여러 디렉터리를 지정하려는 경우 쉘에 따라 다릅니다. 따라서 bash 및 zsh 및 이와 유사한(csh 및 tcsh?)에서는 쉘 글로브만 사용합니다. 셸은 이 glob을 관심 있는 디렉터리로 확장하고 find여러 인수를 사용할 수 있는 에 제공합니다.

find /level1/*/dir02 -name "*.oz"

몇 가지 추가 사항:

  • 여기서 구문은 정규식이 아닌 glob입니다.
  • 어쨌든 정규식이 잘못되었습니다. (인용 무시) 이어야 합니다 /level1/[a-z]*[0-9]*/dir02. s 에 주목하세요 *.
  • 또 다른 옵션은 입니다 -path. man find그러나 이는 단지 쉘 glob을 사용하는 것보다 더 복잡합니다.

답변2

find다음을 사용하는 대체 솔루션 -path:

$ find /level1 -type f -path "/level1/user??/dir02/*.oz" -print

그러면 (전체) 경로가 일치하는 모든 일반 파일의 경로가 인쇄됩니다 /level1/user??/dir02/*.oz.

dir02파일이 해당 디렉터리(하위 디렉터리가 아님) 에 있다는 것을 알고 있으면 해당 파일이 나열됩니다.

printf '%s\n' /level1/user??/dir02/*.oz

관련 정보