찾기 명령 : 대소 문자를 무시하는 방법?


170

거대한 디렉토리 계층에서 "WSFY321.c"파일을 찾고 있습니다.
일반적으로 GNU find를 사용합니다 . find . -name "WSFY321.c"
그러나 대소 문자를 모르는 경우 대문자, 소문자 또는이 둘의 혼합 일 수 있습니다.

이 파일을 찾는 가장 쉬운 방법은 무엇입니까?
보다 좋은 것이 find . | grep -i "WSFY321.c"있습니까?

답변:


214

최신 버전의 GNU find에는 -iname대소 문자를 구분하지 않는 이름 검색을위한 플래그 가 있습니다 .

find . -iname "WSFY321.c"

6
또한 파일을 구체적으로 찾고 있기 때문에 아마도-type f inode가 디렉토리 인 경우 이름을 보지 않아도 플래그로 다른 진드기를 면도 할 수 있습니다 . 그러나 그것은 수준의 최적화 수준입니다 ...
Shadur

정규식 작업을 위해 할 수있는 일find . -iname \*WSFY321.c\* -type f
Benj

40

GNU find 또는 다른 버전의 find를 사용하면 :

find . -iname 'WSFY321.c'

다른 버전으로 :

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

느리지 만 타이핑하기 쉬운 타협 :

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

또는 zsh에서 :

print -rl -- **/(#i)WSFY321.c

@Gillesgrep버전은 대문자 만 필터링하므로 '[^ /]'.. (not /)
Peter.O

@Gilles 첫 번째 경우에 작은 따옴표 (정확한 파일 이름)를 따옴표없이 사용한다는 주장은 무엇입니까?
Bernhard

@ Peter.O 없음 *애프터 /bash는 버전입니다. 나는 의미했다 grep -i. 내가 사용하는 [^/]*것이 아니라 .*, 그 이름으로 시작 디렉토리에 파일을 잡으려고하지 않도록 WSFY.
Gilles

5
@Bernhard 일관성.
Gilles

감사합니다 Gilles : 잘못된 구문으로 이전 주석을 삭제하고 수정 된 버전을 테스트했지만 * (예기치 않은 이유로 최소한) 없이는 작동하지 않습니다. : 대소 문자 구분 옵션은 더 이상 작동하지 않습니다 shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... 나는 그것이 그것이라고 그 이유는 가정 NOCASE 글로브를 이 단지 글로브의 맥락에서 작동 (또는 그렇게 보인다).
Peter.O

1

macOS를위한 두 가지 솔루션 :

GNU 사용 find:

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

GNU 사용 sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"

1
macOS Sierra에서는 기본적으로 -iname 옵션을 사용할 수 있습니다.
ThomasW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.