awk 출력을 사용하여 디렉토리 소유자를 동적으로 변경하는 방법은 무엇입니까?

awk 출력을 사용하여 디렉토리 소유자를 동적으로 변경하는 방법은 무엇입니까?

내가 하고 싶은 것:

  • 사용자 및 해당 홈 디렉터리 목록 가져오기/etc/passwd
  • 사용자 이름과 집 주소를 매개변수로 사용하고 이러한 디렉터리의 소유권을 해당 사용자로 변경합니다.

현재 출력:

잘린 출력: cat /etc/passwd

##
# User Database
# 
# Note that this file is consulted directly only when the system is running
# in single-user mode.  At other times this information is provided by
# Open Directory.
#
# See the opendirectoryd(8) man page for additional information about
# Open Directory.
##
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false

잘린 출력:cat /etc/passwd | grep "^[#;]" -v

nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false
_installassistant:*:25:25:Install Assistant:/var/empty:/usr/bin/false

이제 선행 "_"을 제거해야 하므로 다음 명령을 사용했습니다.

잘린 출력:cat /etc/passwd | grep "^[#;]" -v | sed s/"_"//

nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false

마지막으로 다음 명령을 사용하여 사용자 이름과 디렉터리를 가져왔습니다 awk.

cat /etc/passwd | grep "^[#;]" -v | sed s/"_"// | awk -F\: '{print $1" "$6}' (출력이 잘림)

nobody /var/empty
root /var/root
daemon /var/root
uucp /var/spool/uucp
taskgated /var/empty
networkd /var/networkd
installassistant /var/empty
lp /var/spool/cups
postfix /var/spool/postfix
scsd /var/empty
ces /var/empty
appstore /var/db/appstore

이것이 내가 더하고 싶은 일입니다!

가져가다첫 번째매개변수 및 소유권 할당두번째이에 대한 주장. 어떻게 진행해야 하나요?

답변1

마지막 파일은 다음과 같이 bash에서 처리될 수 있습니다.

cat YOURFILE | \
while read CMD; do 
   field1=${CMD% *};    # take first field
   field2=${CMD#* };    # take second field
   echo do $field1 with $field2;  # do something with it
done

따라서 제대로 작동하려면 echo를 적절한 chown 명령으로 바꿔야 합니다. 에서 가져옴Bash 스크립트에서 한 줄씩 읽기

답변2

문제를 _일으킬 수 있는 이 항목을 제거하려는지 확실하지 않습니다.chown: _user not foundchown

노력하다

awk -F: '/^#/ { next } {printf "chown %s \"%s\"\n",$1,$6} ' my_etc_passwd

어디

  • -F::awk에게 구분 기호 로 사용하도록 지시
  • /^#/ { next }다음으로 시작하는 줄 건너뛰기#
  • /^_/ { next }(필요한 경우)로 시작하는 줄 건너뛰기 에 추가_
  • 다음 모드/작업은 chown 명령을 인쇄합니다.

결과가 좋아 보이면 다음으로 파이프하면 됩니다.bash

답변3

awk를 사용하면 다른 명령과 파이프가 많이 필요하지 않습니다. 올바른 작성 방법:

cat /etc/passwd | grep "^[#;]" -v | sed s/"_"// | awk -F\: '{print $1" "$6}'

예:

awk -F':' '!/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd

그런 다음 셸에서 해당 출력을 사용합니다. :--delimited 입력이 있으므로 awk 명령을 약간 수정하여 --delimited 출력을 생성하므로 :입력 필드 값에 s가 없어야 합니다.:

while IFS=':' read -r user dir; do
    echo chown -- "$user" "$dir"
done < <(awk 'BEGIN{FS=OFS=":"} !/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd)

또는 원하는 경우:

awk 'BEGIN{FS=":"; OFS=ORS} !/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd |
xargs -n 2 bash -c 'echo chown "$1" "$2"' bash

echo테스트를 마치고 실제로 실행하고 싶을 때 제거하세요.chown

답변4

@Archemar의 답변을 사용하여 나에게 도움이 되는 다음 코드를 사용했습니다! _을(를) 삭제하면 오류가 발생할 수 있다는 점을 지적해 주셔서 감사합니다.

awk -F\: '/^#/{next}''{system("chown " $1" " $6)}' /etc/passwd

관련 정보