이름이 인 파일을 찾으려고 하는데 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
실제로는 필요하지 않습니다. 명확성을 위해 여기에 남겨 두겠습니다.)
여기에 몇 가지 추가 수정 사항을 적용했습니다. 패턴은 이름이 지정된 파일 *.zip
만zip
정확히"압축". 다른 요소의 일부가 아닌 별도의 요소로 인식 !
되도록 공백으로 구분했으며 find
, 대화식으로 명령을 사용할 경우 쉘이 이를 역사적 참조로 해석하지 않도록 작은따옴표로 인용했습니다.
2>&1 and
그런데, grep -iv "not"은 어떻게 되나요? 오류 메시지를 필터링하려고 하고 다른 셸이 아닌 bash를 사용하는 경우 명령 대체를 사용하여 출력 및 오류 스트림이 혼합되는 것을 방지할 수 있습니다.
find / -name "dork*" -and '!' -name "*.zip" 2> >(grep -iv "not" >&2)