나는 그 반대를 하고 싶다:
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 바이트)로 인코딩된 경우 시스템이 파일을 보고합니다.é
파일 이름이 로케일의 문자 세트로 인코딩되었는지 확인하는 것이 가장 좋지만 이것이 보장될 수 없는 경우 해결 방법은 find
C 로케일에서 실행하는 것입니다.
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