@meuh의 접근 방식은 그의 -maxdepth 1
접근 방식 find
으로 레벨 1에서 디렉토리의 내용을 읽을 수 있으므로 나중에 무시할 수 있기 때문에 비효율적 입니다. 일부 디렉토리 이름에 사용자 로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스 (예 : 다른 문자 인코딩의 파일 이름)가 find
포함 된 find
경우 일부 구현 (GNU 포함 ) 에서는 제대로 작동 하지 않습니다.
find . \( -name . -o -prune \) -extra-conditions-and-actions
GNU -maxdepth 1
(또는 FreeBSD -depth -2
) 를 구현하는보다 정식적인 방법 입니다.
그러나 일반적으로 고려하지 않으려는 경우 -depth 1
( -mindepth 1 -maxdepth 1
) .
(깊이 0), 더 간단합니다.
find . ! -name . -prune -extra-conditions-and-actions
의 경우 -maxdepth 2
는 다음과 같습니다.
find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions
그리고 그것은 당신이 잘못된 문자 문제에서 실행되는 곳입니다.
예를 들어, 디렉토리가 Stéphane
있지만 é
2000 년대 중반까지 서유럽과 미국에서 가장 일반적인 iso8859-1 (일명 latin1) 문자 세트 (0xe9 바이트)로 인코딩 된 경우 0xe9 바이트는 UTF-8의 유효한 문자. 그래서, UTF-8 로켈에서 *
(일부와 와일드 카드 find
구현) 일치하지 않습니다 Stéphane
으로 *
0 이상 문자 와 문자가 0xe9 없습니다.
$ locale charmap
UTF-8
$ find . -maxdepth 2
.
./St?phane
./St?phane/Chazelas
./Stéphane
./Stéphane/Chazelas
./John
./John/Smith
$ find . \( ! -path './*/*' -o -prune \)
.
./St?phane
./St?phane/Chazelas
./St?phane/Chazelas/age
./St?phane/Chazelas/gender
./St?phane/Chazelas/address
./Stéphane
./Stéphane/Chazelas
./John
./John/Smith
My find
(출력이 터미널로 갈 때)는 ?
위와 같이 잘못된 0xe9 바이트를 표시합니다 . St<0xe9>phane/Chazelas
그것이 prune
d 가 아니라는 것을 알 수 있습니다 .
다음을 수행하여 문제를 해결할 수 있습니다.
LC_ALL=C find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions
그러나 find
이는 -exec
술어 를 통해와 같이 모든 로케일 설정 및 실행되는 응용 프로그램에 영향을 미칩니다 .
$ LC_ALL=C find . \( ! -path './*/*' -o -prune \)
.
./St?phane
./St?phane/Chazelas
./St??phane
./St??phane/Chazelas
./John
./John/Smith
이제 실제로 -maxdepth 2
UTF-8로 올바르게 인코딩 된 두 번째 Stéphane의 é가 é의 UTF-8 인코딩 ??
의 0xc3 0xa9 바이트 (C 로케일에서 두 개의 개별 정의되지 않은 문자로 간주 됨)로 표시되는 방법에 유의하십시오. C 로케일에서 인쇄 할 수없는 문자.
그리고를 추가했다면 -name '????????'
잘못된 스테판 (iso8859-1로 인코딩 된)을 얻었을 것입니다.
대신 임의의 경로에 적용하려면 .
다음을 수행하십시오.
find some/dir/. ! -name . -prune ...
대한 -mindepth 1 -maxdepth 1
나 :
find some/dir/. \( ! -path '*/./*/*' -o -prune \) ...
에 대한 -maxdepth 2
.
나는 여전히 :
(cd -P -- "$dir" && find . ...)
그로 실행하는 것이 덜하게하는 경로 짧은하게 우선하기 때문에 너무 긴 경로 또는 너무 긴 인수 목록 뿐만 아니라 사실를 해결하려면 문제를 find
(제외하고 임의의 경로 인수를 지원하지 않습니다 -f
FreeBSD의에 find
)가에 질식 것 같은 $dir
like !
또는 -print
...의 값
-o
부정과의 조합은 두 개의 독립적 인 세트를 실행하는 일반적인 트릭 -condition
/을 -action
에 find
.
-action1
파일 회의 -condition1
및 파일 회의 에서 독립적 -action2
으로 실행하려면 다음을 수행 -condition2
할 수 없습니다.
find . -condition1 -action1 -condition2 -action2
으로는 -action2
만 충족 파일을 실행 될 두 조건을.
도 아니다:
find . -contition1 -action1 -o -condition2 -action2
으로는 -action2
충족 파일을 실행할 수 없습니다 것 모두 조건을.
find . \( ! -condition1 -o -action1 \) -condition2 -action2
모든 파일에 대해 true 로 \( ! -condition1 -o -action1 \)
해결되는 것처럼 작동 합니다. 그 가정은 액션 (같은 것입니다 , 항상 반환) 사실 . 같은 행동을 위해 그 반환 할 수 있습니다 거짓 , 다른 추가 할 수 있습니다 곳 무해을하지만, 반환 사실 처럼 GNU에서 나 또는 (이상 유효하지 않은 문자에 대한 참고하지만 문제).-action1
-prune
-exec ... {} +
-exec ... \;
-o -something
-something
-true
find
-links +0
-name '*'
-depth -2
,-depth 1
... 방법은 GNU의보다 더 나은로 볼 수있다-maxdepth
/-mindepth