find( -name/ -path표준 술어의 경우)는 glob와 같은 와일드 카드 패턴을 사용합니다 ( {a,b}glob 연산자는 아닙니다. 확장 후에는 2 개의 glob가 나타납니다). 주요 차이점은 슬래시 (및 점 파일 및 디렉토리에서 특별히 처리되지 않는)를 처리하는 것 find입니다. *globs에서는 여러 디렉토리에 걸쳐 있지 않습니다. */*/*최대 2 단계의 디렉토리가 나열됩니다. 를 추가하면 -path './*/*/*'최소 3 레벨 깊이의 파일과 일치하며 find디렉토리의 내용을 깊이있게 나열하는 것을 중단하지 않습니다 .
그 특정
./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
몇 개의 glob, 번역하기 쉽고 깊이 3의 디렉토리를 원하므로 다음을 사용할 수 있습니다.
find . -mindepth 3 -maxdepth 3 \
\( -path './foo*bar/quux[A-Z].bak/pic[0-9][0-9][0-9][0-9]?.jpg' -o \
-path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg' \) \
-exec cmd {} +
(또는 -depth 3일부 find구현). 또는 POSIXly :
find . -path './*/*/*' -prune \
\( -path './foo*bar/quux[A-Z].bak/pic[0-9][0-9][0-9][0-9]?.jpg' -o \
-path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg' \) \
-exec cmd {} +
어떤 그 보장 것 *과 ?일치하지 않을 수 있습니다 /문자.
( find, globs와는 달리 foo*bar현재 디렉토리에있는 디렉토리 이외의 디렉토리의 내용을 읽고 ¹ 파일 목록을 정렬하지 않습니다. 그러나 우리 가 잘못된 문자와 관련하여 일치 [A-Z]하거나 */ 의 동작 ?이 지정하지 않으면 동일한 파일 목록이 표시됩니다).
그러나 @muru가 보았 듯이 시스템 호출 find의 한계를 극복 하기 위해 파일 목록을 여러 개의 실행으로 나누는 경우에만 의존 할 필요가 없습니다 execve(). zsh(포함 zargs) 또는 ksh93(포함 ) 과 같은 일부 쉘 command -x은 기본적으로 지원합니다.
함께 zsh(또한 그 globs와의 등가가 -type f가장 다른 find조건)를, 예를 들어 :
autoload zargs # if not already in ~/.zshrc
zargs ./foo*bar/quux[A-Z](|.bak)/pic[0-9][0-9][0-9][0-9]?.jpg(.) -- cmd
( (|.bak)에 글로브 운영자 반하는 {,.bak}는 (.)것과 같습니다 규정 글로브 find의 ' -type f추가 oN와 같은 정렬 건너 거기에 find, D- 파일을 점 (이 글로브 적용되지 않음) 포함)
¹ findglobs와 같이 디렉토리 트리를 크롤링하려면 다음과 같은 것이 필요합니다.
find . ! -name . \( \
\( -path './*/*' -o -name 'foo*bar' -o -prune \) \
-path './*/*/*' -prune -name 'pic[0-9][0-9][0-9][0-9]?.jpg' -exec cmd {} + -o \
\( ! -path './*/*' -o -name 'quux[A-Z]' -o -name 'quux[A-Z].bak' -o -prune \) \)
즉, 디렉토리를 제외한 레벨 1에서 모든 디렉토리를 제거foo*bar 하고 하나 quux[A-Z]또는 둘을 제외한 레벨 2 에서 모든 디렉토리를 정리 quux[A-Z].bak한 다음 pic...레벨 3에서 디렉토리를 선택하고 해당 레벨에서 모든 디렉토리를 정리합니다.
-path또는로 결과 식을 사용할 수 있어야합니다-ipath.find . -path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg'일치한다는 점을 제외하고 작동해야합니다/fooz/blah/bar/quuxA/pic1234d.jpg. 그게 문제가 될까요?