이 페이지의 다른 솔루션은 확장 목록이 길거나 -not -name 'this' -not -name 'that' -not -name 'other'
지루하고 오류가 발생하기 쉬운 긴 확장 목록이 있거나 검색이 프로그래밍 방식이고 확장 목록이 런타임에 빌드되는 경우 바람직하지 않습니다 .
이러한 상황에서는 데이터 (확장자 목록)와 코드 (에 대한 매개 변수)를보다 명확하게 분리하는 솔루션이 find
바람직 할 수 있습니다. 다음과 같은 디렉토리 및 파일 구조가 제공됩니다.
.
└── a
├── 1.txt
├── 15.xml
├── 8.dll
├── b
│ ├── 16.xml
│ ├── 2.txt
│ ├── 9.dll
│ └── c
│ ├── 10.dll
│ ├── 17.xml
│ └── 3.txt
├── d
│ ├── 11.dll
│ ├── 18.xml
│ ├── 4.txt
│ └── e
│ ├── 12.dll
│ ├── 19.xml
│ └── 5.txt
└── f
├── 13.dll
├── 20.xml
├── 6.txt
└── g
├── 14.dll
├── 21.xml
└── 7.txt
다음과 같이 할 수 있습니다 :
## data section, list undesired extensions here
declare -a _BADEXT=(xml dll)
## code section, this never changes
BADEXT="$( IFS="|" ; echo "${_BADEXT[*]}" | sed 's/|/\\|/g' )"
find . -type f ! -regex ".*\.\($BADEXT\)"
결과 :
./a/1.txt
./a/b/2.txt
./a/b/c/3.txt
./a/d/4.txt
./a/d/e/5.txt
./a/f/6.txt
./a/f/g/7.txt
코드 블록을 변경하지 않고 확장 목록을 변경할 수 있습니다.
참고 기본 OSX에서는 작동하지 않습니다 find
. 대신 gnu find를 사용하십시오.
-not
로 교체 할 수 있습니다'!'
(견적 권장). 반면에,-name
대소 문자를 구분하면서이-iname
사례를 구분하지 않습니다.