Unix에서 특정 확장자로 끝나지 않는 파일 이름을 찾으십니까?


207

디렉토리 목록에서 확장자 목록으로 끝나지 않는 모든 파일을 재귀 적으로 찾을 수있는 간단한 방법이 있습니까? 예를 들어 * .dll 또는 * .exe가 아닌 모든 파일

UNIX / GNU 찾기는 강력하지만 exclude모드 가없는 것 같습니다 (또는 누락되었습니다). 나는 항상 정규 표현식을 사용 하여 특정 표현식과 일치 하지 않는 것을 찾는 것이 어렵다는 것을 알았습니다 .

저는 Windows 환경 ( 대부분의 GNU 도구 의 GnuWin32 포트 사용)에 있으므로 Windows 전용 솔루션에 대해서도 동일하게 개방되어 있습니다.

답변:


343

또는없이 (그리고 그것을 벗어날 필요가 있습니다.

find . -not -name "*.exe" -not -name "*.dll"

디렉토리 목록도 제외

find . -not -name "*.exe" -not -name "*.dll" -not -type d

또는 긍정적 인 논리 ;-)

find . -not -name "*.exe" -not -name "*.dll" -type f

6
-not로 교체 할 수 있습니다 '!'(견적 권장). 반면에, -name대소 문자를 구분하면서이 -iname사례를 구분하지 않습니다.
Ivan Chau


8
$ find . -name \*.exe -o -name \*.dll -o -print

처음 두 개의 -name 옵션에는 -print 옵션이 없으므로 건너 뜁니다. 다른 모든 것이 인쇄됩니다.


4

grep 명령을 사용하여 무언가를 수행 할 수 있습니다.

find . | grep -v '(dll|exe)$'

-v플래그는 grep구체적으로 " 이 표현과 일치 하지 않는 것을 찾습니다"를 의미 합니다.


6
grep -v '\. (dll | exe) $'는 예를 들어 "dexe"라는 파일 또는 dir과 일치하지 않도록합니다.
drAlberT

이것은 정규 표현식 확장에서만 작동합니다. 이 작업을 수행하려면 -E를 추가하거나 egrep을 사용해야했습니다.
joctee 2012 년

2

하나 더 :-)

$ ls -ltr
총 10
-rw-r--r-- 1 scripter linuxdumb 47 12 월 23 일 14:46 test1
-rw-r--r-- 1 scripter linuxdumb 0 1 월 4 일 23:40 test4
-rw-r--r-- 1 scripter linuxdumb 0 1 월 4 일 23:40 test3
-rw-r--r-- 1 scripter linuxdumb 0 1 월 4 일 23:40 test2
-rw-r--r-- 1 scripter linuxdumb 0 1 월 4 일 23:41 파일 5
-rw-r--r-- 1 scripter linuxdumb 0 1 월 4 일 23:41 파일 4
-rw-r--r-- 1 scripter linuxdumb 0 1 월 4 일 23:41 파일 3
-rw-r--r-- 1 scripter linuxdumb 0 1 월 4 일 23:41 파일 2
-rw-r--r-- 1 scripter linuxdumb 0 1 월 4 일 23:41 파일 1
$ 찾기. 유형 f! 이름 "* 1"! -이름 "* 2"-print
./test3
./test4
./file3
./file4
./file5
$

유닉스 찾기 명령 참조


1
find  /data1/batch/source/export   -type f -not  -name "*.dll" -not -name "*.exe"

1

리눅스 / OS X :

현재 디렉토리에서 시작하여 .dll 또는 .exe로 끝나는 모든 파일을 재귀 적으로 찾습니다.

find . -type f | grep -P "\.dll$|\.exe$"

현재 디렉터리에서 시작하여 .dll 또는 .exe로 끝나지 않는 모든 파일을 재귀 적으로 찾습니다.

find . -type f | grep -vP "\.dll$|\.exe$"

노트:

(1) grep의 P 옵션은 우리가 Perl 스타일을 사용하여 grep 명령 과 함께 사용할 정규 표현식을 작성하고 있음을 나타냅니다 . excecuting의 목적을 위해 그렙 정규 표현식과 함께 명령을, 나는 펄 스타일이 가장 강력한 스타일 주위는 사실을 알게 될 것입니다.

(2) grep의 v 옵션은 정규식을 만족하는 파일을 제외하도록 쉘에 지시합니다.

(3) ".dll $"의 끝에있는 $ 문자는 파일 이름 문자열이 ".dll"로 끝나는 것을 쉘에 알리는 구분 기호 제어 문자입니다.


0

이 페이지의 다른 솔루션은 확장 목록이 길거나 -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를 사용하십시오.

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