파일이나 디렉토리를 얻는 find 명령

파일이나 디렉토리를 얻는 find 명령

파일과 디렉터리를 찾는 find 명령을 작성하려고 하는데, 문제는 명령의 특정 변수에 따라 파일이나 오류만 받는다는 것입니다.

이 명령은 아무것도 출력하지 않습니다.

find '/mnt/downloads/cache/' -depth -mindepth 1 \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) -print

이는 이 두 필터가 () 안에 캡슐화되어 있지 않기 때문입니다. 왜 큰따옴표가 필요한가요?

이 명령은 파일만 출력하고 디렉터리는 출력하지 않습니다.

find '/mnt/downloads/cache/' -depth -mindepth 1 \( \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) \) -print

두 매개변수를 묶는 추가 괄호가 유일한 차이점입니다.

이 명령의 마지막 변형으로 인해 오류가 발생합니다.

find '/mnt/downloads/cache/' -depth -mindepth 1 \( \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty {} \) \) -print

find: paths must precede expression: {}

디렉터리 테스트 후에 두 번째 {} 세트를 추가하면 이 오류가 발생하는 이유는 무엇인가요?

수정된 명령:

find "/mnt/downloads/cache" -depth -mindepth 1 \( \
-type f \! -exec fuser -s '{}' \; -o \
-type d \! -empty \) \
-print

답변1

암묵적이므로그리고( -a)의 우선순위가 높을수록 -o첫 번째 수식의 오른쪽이 하나 -o의 단위로 처리됩니다.또는작업은 다음과 같습니다.

\( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) -print

다음과 동일하게 작동합니다.

\( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty -print \)

따라서 파일의 경우 실행 fuser되고 디렉터리의 경우 이름이 인쇄됩니다.


두번째:

\( \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) \) -print

명시적인 괄호가 있지만 내부 괄호가 필요하지 않은 경우 이는 동일합니다.

\( -type f ! -exec fuser -s {} \;  -o  -type d -empty  \) -print

fuser잘못된 값(!= 0, inversion )을 반환 !하는 모든 빈 디렉터리와 파일을 인쇄해야 합니다 .


... -empty {} ...경로 이름으로 처리 되는 세 번째 항목에서는 {}오류 메시지가 문제가 무엇인지 알려줍니다.

관련 정보