지정된 문자열을 포함하지 않는 파일 이름 찾기

지정된 문자열을 포함하지 않는 파일 이름 찾기

나는 그 반대를 하고 싶다:

find . -name "*2013*"

이름에 "2013" 문자열이 포함되지 않은 현재 디렉터리의 모든 파일을 찾습니다. 어떻게 해야 하나요?

답변1

간단히:

find . ! -name '*2013*'

추가하면 ! -type d해당 유형의 파일을 제외할 수도 있습니다.목차(그대로 .) 또는 -type f그냥 포함정기적인다른 모든 유형의 파일(디렉토리, fifo, 심볼릭 링크, 장치, 소켓...)을 제외한 파일.

*하지만 0개 이상의 시퀀스를 일치시키 도록 주의하세요.수치. 따라서 현재 로케일에서 유효한 문자로 완전히 디코딩할 수 없는 콘텐츠 2013앞이나 뒤에 오는 파일 이름을 보고할 수 있습니다.2013

문자를 여러 바이트로 인코딩할 수 있는 로케일(예: UTF-8)에 있고 파일 이름이 다른 인코딩에 있는 경우 이런 일이 발생할 수 있습니다. 예를 들어, 최소한 UTF-8 로케일 및 GNU 시스템에서는 Stéphane2013파일이 iso8859-15 문자 세트(0xe9 바이트)로 인코딩된 경우 시스템이 파일을 보고합니다.é

파일 이름이 로케일의 문자 세트로 인코딩되었는지 확인하는 것이 가장 좋지만 이것이 보장될 수 없는 경우 해결 방법은 findC 로케일에서 실행하는 것입니다.

LC_ALL=C find . ! -name '*2013*'

2013기본 이름뿐만 아니라 경로의 어느 위치에서든 파일을 제외하려면 다음을 수행할 수 있습니다.

LC_ALL=C find . ! -path '*2013*'

이것이 더 효율적일 것입니다:

LC_ALL=C find . -name '*2013*' -prune -o -print

즉, 이름이 포함된 find디렉토리 2013( prune트리의 해당 부분)에 굳이 들어가지 말라고 지시받습니다. 왜냐하면 경로에 2013.


1 수백 개의 멀티바이트 문자가 있고 2.

답변2

Ksh 파일 이름 패턴이면 충분합니다.

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

인용하다

쉘이 bash인 경우 이 모드를 사용하기 전에 bash를 실행해야 합니다 shopt -s extglob(쉘에 넣을 수 있음 .bashrc). 쉘이 zsh인 경우 실행해야 합니다 setopt ksh_glob( 에 넣을 수 있음 .zshrc). Zsh도 제공되므로 ls -d -- ^*2013*사전 준비가 필요합니다 setopt extended_glob.

이러한 파일 이름으로 수행하는 작업에 따라 ls이는 올바른 명령이 아닐 수도 있습니다. 배열에 저장

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

답변3

find의 대안은 일치 항목의 의미를 바꾸어 일치하지 않는 행을 선택하는 piping 옵션을 사용하는 것 !입니다 .egrep-v

find . | egrep -v 2013

여기서 장점은 egrep의 모든 기능을 사용하여 원하는 방식으로 출력을 필터링한다는 것입니다.

답변4

현재 디렉터리에서 특정 문자열을 포함하지 않는 모든 파일을 찾습니다(여기서는 "2013").

find . ! -name "*2013*" -type f

관련 정보