파일과 디렉터리를 찾는 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 {} ...
경로 이름으로 처리 되는 세 번째 항목에서는 {}
오류 메시지가 문제가 무엇인지 알려줍니다.