find 명령 이해 [닫기]

find 명령 이해 [닫기]

이름이 인 파일을 찾으려고 하는데 dork이름이 인 파일을 제외하고 싶습니다 dork.zip. 또한 디렉터리 권한의 오류도 제거했습니다.

그래서 다음과 같이 명령을 작성합니다.

find /  -name "dork*" -and !"zip" 2>&1 | grep -iv "not" 

예상대로 작동하지 않았습니다.

답변1

find / -name 'dork*' ! -name '*.zip'

두 가지 테스트를 사용해야 합니다 -name. 하나는 일치용 dork*이고 다른 하나는 일치용입니다 *.zip. 두 번째는 !발견된 이름이 일치하지 않도록 반전( )되어야 합니다. 테스트 사이에는 항상 암시적 AND가 있습니다.

암시적 AND를 가시화합니다:

find / -name 'dork*' -a ! -name '*.zip'

또한 비표준 GNU 구문을 사용합니다.

find / -name 'dork*' -and -not -name '*.zip'

결과 오류를 무시하려면 표준 오류 스트림을 /dev/null끝에 with로 리디렉션하세요.2>/dev/null

GNU를 사용하면 find읽을 수 없는 디렉토리를 입력하지 않도록 선택할 수 있습니다.

find / \( -type d -not -readable -prune \) -or \
       \( -name 'dork*' -not -name '*.zip' -print \)

답변2

표현식의 구문을 잘못 이해했습니다 find. 제 생각에는 테스트가 찾고 있는 패턴을 -name처리 할 것으로 기대하고 계시겠지만,"dork*" -and !"zip"-name단일 패턴 문자열, 어떤 표현보다는. 이를 구문 분석하는 방법은 find다음과 같습니다. (이름 일치 dork*) 및 ( !zip) !zip는 기본 표현식과 별도의 하위 표현식입니다 -name. 하지만 이는 !zip유효한 표현식이 아니므로 오류가 발생합니다.

dork*(이름이 일치함 ) 및 (이름이 일치하지 않음 ) 과 더 유사한 것을 원합니다 *.zip.

find /  -name "dork*" -and '!' -name "*.zip"

( -and실제로는 필요하지 않습니다. 명확성을 위해 여기에 남겨 두겠습니다.)

여기에 몇 가지 추가 수정 사항을 적용했습니다. 패턴은 이름이 지정된 파일 *.zipzip정확히"압축". 다른 요소의 일부가 아닌 별도의 요소로 인식 !되도록 공백으로 구분했으며 find, 대화식으로 명령을 사용할 경우 쉘이 이를 역사적 참조로 해석하지 않도록 작은따옴표로 인용했습니다.

2>&1 and그런데, grep -iv "not"은 어떻게 되나요? 오류 메시지를 필터링하려고 하고 다른 셸이 아닌 bash를 사용하는 경우 명령 대체를 사용하여 출력 및 오류 스트림이 혼합되는 것을 방지할 수 있습니다.

find /  -name "dork*" -and '!' -name "*.zip" 2> >(grep -iv "not" >&2)

관련 정보