여러 조건이 포함된 명령 찾기

여러 조건이 포함된 명령 찾기

다음 사용 사례를 보여드리겠습니다.

[root@localCentOS71 folder]# ls -lah
total 16K
drwxr-xr-x 3 root root  4.0K Dec 22 08:52 .
drwxr-xr-x 4 root root  4.0K Dec 21 14:59 ..
-rw-r--r-- 1 root test     0 Dec 22 08:52 file
drwxr-xr-x 2 root root  4.0K Dec 21 14:59 hi
-rw-r--r-- 1 root root     0 Dec 22 08:46 .htaccess
-rw-r--r-- 1 root root   175 Dec 22 08:47 test

find실행할 명령을 호출하려고 합니다 .

  • 일반 파일만 찾기
  • 소유자가 루트가 아닌 위치를 찾거나
  • 검색 그룹이 루트가 아니거나
  • 권한이 775가 아닌 곳도 찾아보세요
  • .htaccess 파일 제외

현재 명령:

find /folder -not -user root -or -not -group test -type f \( ! -iname ".htaccess" \) -or -not -perm 775

원하는 출력:

/folder/test
/folder/file

실제 출력:

/folder
/folder/.htaccess
/folder/hi
/folder/test
/folder/file

답변1

-a(생략된 경우 두 조건자 사이의 암시적 우선순위)가 앞에 있으므로 괄호 -o를 사용해야 합니다.

find /folder ! -name .htaccess -type f \( \
   ! -user root -o ! -group test -o ! -perm 775 \)

또는:

find /folder ! -name .htaccess -type f ! \( \
   -user root -group test -perm 775 \)

파일에 대한 작업이 -name필요하지 않으므로 최적화를 위한 첫 번째 작업을 수행합니다 . lstat()일부 find구현에서는 자체적으로 최적화를 수행합니다(내부적으로 조건자 목록 재정렬).

-not및 은 -or비표준 GNU 확장입니다. 표준 동등물 !입니다 -o.

우선순위 규칙으로 인해

find /folder -not -user root -or -not -group test -type f \( 
  ! -iname ".htaccess" \) -or -not -perm 775

실제로는 다음과 같이 해석될 수 있습니다.

find /folder \( -not -user root \) -or \
             \( -not -group test -a \
                -type f -a \
               \( ! -iname ".htaccess" \) \
             \) -or \
             \( -not -perm 775 \)

관련 정보