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


19

나는 반대의 것을 실행하고 싶다 :

find . -name "*2013*"

현재 디렉토리에서 이름에 문자열 "2013"이 포함되지 않은 모든 파일을 찾으십시오. 어떻게해야합니까?

답변:


28

간단히:

find . ! -name '*2013*'

디렉토리! -type d 유형의 파일 (예 : 자체)을 제외 하거나 다른 모든 유형의 파일 (디렉토리, fifo, 심볼릭 링크, 장치, 소켓 ...)을 제외한 일반 파일 만 포함 하려면 a 를 추가하십시오 ..-type f

그러나 *0 이상의 시퀀스와 일치하는 것을주의하십시오 . 그것은 포함하는 파일 이름을보고 할 수 있도록 2013그 경우 2013선행 또는 완전히 현재 로케일에서 유효한 문자로 디코딩 할 수없는 무언가 이어되었다.

다른 인코딩으로 인코딩 된 파일 이름에 대해 문자를 둘 이상의 바이트 (UTF-8과 같이)로 인코딩 할 수있는 로케일 인 경우 발생할 수 있습니다. 예를 들어, UTF-8 로케일에서 Stéphane2013파일을 보고하면é 이 iso8859-15 문자 세트 (0xe9 바이트)로 인코딩 된 .

파일 이름이 로케일의 문자 세트로 인코딩되어 있는지 확인하는 것이 가장 좋지만 보장 할 수없는 경우 findC 로케일에서 임시 해결책 을 실행 하십시오.

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

4

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

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

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

참고

쉘이 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

4
하위 디렉토리에서 재귀하지 않고 도트 파일을 건너 뜁니다 ( ls패턴이 파일과 일치하지 않으면 오류 메시지를 반환합니다). 또한 ksh목록을 정렬합니다.
Stéphane Chazelas

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