tcsh의 find 명령 결과에서 여러 사용자를 제외하는 방법은 무엇입니까?

tcsh의 find 명령 결과에서 여러 사용자를 제외하는 방법은 무엇입니까?

조회 결과에서 사용자 그룹을 제외하고 싶습니다. 그들은 동일한 Unix 그룹에 속하지 않습니다. 이것이 최선의 방법은 아닙니다. 그렇죠?

find . -maxdepth 1 -type d -name '*_pattern_*' ! -user user1 ! -user user2 ...

사용자를 문자열이나 배열로 전달할 수 있나요? 어쩌면 awk를 사용할 수도 있나요?

답변1

findcshell에서는 다음과 같이 작업을 실행하는 명령을 함께 모을 수 있습니다 .

 #!/bin/tcsh -f

 # persona non grata
 set png = ( \
    user1 \
    user2 \
    user3 \
    user4 \
 ) 

 # build dynamically a portion of the `find` command
 set cmd = ( `printf '! -user %s\n' $png:q` )

 # now fire the generated find command
 find . -maxdepth 1 -type d -name '*_pattern_*'  $cmd:q

답변2

이스케이프 처리되지 않은 느낌표가 마음에 들지 않는다는 사실 외에도 csh명령줄에서 명령은 괜찮아 보이고 더 이상 수행할 수 없습니다.

답변3

스크립트에서 실행하고 싶다면 다음을 수행하세요 /bin/sh.

#!/bin/sh

# the users to avoid
set -- user1 user2 user3 user4

# create a list of 
# -o -user "username" -o -user "username" etc.
for user do
    set -- "$@" -o -user "$user"
    shift
done
shift # remove that first "-o"

# use the created array in the call to find
find . -maxdepth 1 -type d -name '*_pattern_*' ! '(' "$@" ')'

또는 ! -user "username"사용 중인 것과 동일한 유형의 목록을 작성하십시오.

#!/bin/sh

# the users to avoid
set -- user1 user2 user3 user4

# create a list of 
# ! -user "username" ! -user "username" etc.
for user do
    set -- "$@" ! -user "$user"
    shift
done

# use the created array in the call to find
find . -maxdepth 1 -type d -name '*_pattern_*' "$@"

관련 정보