답변:
간단히:
find . ! -name '*2013*'
디렉토리! -type d
유형의 파일 (예 : 자체)을 제외 하거나 다른 모든 유형의 파일 (디렉토리, fifo, 심볼릭 링크, 장치, 소켓 ...)을 제외한 일반 파일 만 포함 하려면 a 를 추가하십시오 ..
-type f
그러나 *
0 자 이상의 시퀀스와 일치하는 것을주의하십시오 . 그것은 포함하는 파일 이름을보고 할 수 있도록 2013
그 경우 2013
선행 또는 완전히 현재 로케일에서 유효한 문자로 디코딩 할 수없는 무언가 이어되었다.
다른 인코딩으로 인코딩 된 파일 이름에 대해 문자를 둘 이상의 바이트 (UTF-8과 같이)로 인코딩 할 수있는 로케일 인 경우 발생할 수 있습니다. 예를 들어, UTF-8 로케일에서 Stéphane2013
파일을 보고하면é
이 iso8859-15 문자 세트 (0xe9 바이트)로 인코딩 된 .
파일 이름이 로케일의 문자 세트로 인코딩되어 있는지 확인하는 것이 가장 좋지만 보장 할 수없는 경우 find
C 로케일에서 임시 해결책 을 실행 하십시오.
LC_ALL=C find . ! -name '*2013*'
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
현재 디렉토리에서 특정 문자열을 포함하지 않는 모든 파일을 찾으십시오 (예 : "2013").
find . ! -name "*2013*" -type f
ls
패턴이 파일과 일치하지 않으면 오류 메시지를 반환합니다). 또한ksh
목록을 정렬합니다.