bash xargs 및 sleep을 사용하여 채널에서 Slack 멤버를 제거하시겠습니까?

bash xargs 및 sleep을 사용하여 채널에서 Slack 멤버를 제거하시겠습니까?

"비공개" Slack 채널에서 한 그룹의 사람들을 제거하고 싶습니다.

사용 사례:이런, 방금 잘못된 채널에 137명을 추가했습니다!

Slack 회원 ID 목록은 Airtable 스프레드시트 열에서 가져옵니다.

  1. Airtable에서 셀 범위 복사
  2. 단일 공백으로 구분된 문자열로 값 형식 지정
  3. MemberID 목록에 채널 ID를 추가하기 전

다음과 같이 입력 매개변수를 구성합니다.

$ sh script.sh ChannelID MemberID1[ MemberID2 MemberID3 ...]

#!/bin/bash
args=("$@")
channel=${args[0]}
for arg in "${@:2}"; do
  curl -X POST \
    -H 'Authorization: Bearer foobar' \
    -H "Content-Type":"application/json; charset=utf-8" \
    --data '{"channel":"'"$channel"'", "user":"'"$arg"'"}' \
    https://slack.com/api/conversations.kick;
done

이것Slack API 메소드내 컬링은 한 번에 하나의 MemberID에서만 작동하도록 제한되며 분당 50개의 cURL POST만 허용하도록 제한됩니다(레벨 3). 50개 이상의 MemberID 목록을 가져오고 1분 간격으로 50명씩 일괄 처리되도록 하고 싶습니다.

나는 xargs를 조사하기 시작했고 다음을 수행했습니다.

if [ ${#args[@]} -gt 2 ]; then
  echo "channel ID: $channel"
  echo "${#args[@]} items in the argument array"
  echo "${@:2}"
  xargs -n 2 <<<${@:2} | xargs -I {} echo {} | sed -e 's/ /,/g'
fi
$ sh test.sh FO1O2B3A4R 1 2 3 4 5 6 7 8 9 10 11
    channel ID: FO1O2B3A4R
    12 items in the argument array
    1 2 3 4 5 6 7 8 9 10 11
    1,2
    3,4
    5,6
    7,8
    9,10
    11

xargs를 사용하여 50개 멤버의 배치를 만든 다음 각 멤버에 대해 cURL 명령을 실행하고 sleep 60s배치 실행 사이에 1분()을 기다릴 수 있습니까?

답변1

50개 항목을 일괄 처리하려면 루프를 사용하는 것이 xargs -n 50아마도 최선의 선택일 것입니다.while

예를 들어

list="user1 user2 user3 user4 user5 user6 user7 user8 user9 user10 user11 user12 user13 user14 user15 user16 user17 user18 user19 user20 user21 user22 user23 user24 user25 user26 user27 user28 user29 user30 user31 user32 user33 user34 user35 user36 user37 user38 user39 user40 user41 user42 user43 user44 user45 user46 user47 user48 user49 user50 user51 user52 user53 user54 user55 user56 user57 user58 user59 user60 user61 user62 user63 user64 user65 user66 user67 user68 user69 user70 user71 user72 user73 user74 user75 user76 user77 user78 user79 user80 user81 user82 user83 user84 user85 user86 user87 user88 user89 user90 user91 user92 user93 user94 user95 user96 user97 user98 user99 user100"

echo "$list" | xargs -n 50 echo | while read line
do
  echo Do Something with $line
  sleep 61
done

이것을 실행하면 루프가 두 번 실행되는 것을 볼 수 있습니다.

Do Something with user1 user2 user3 user4 user5 user6 user7 user8 user9 user10 user11 user12 user13 user14 user15 user16 user17 user18 user19 user20 user21 user22 user23 user24 user25 user26 user27 user28 user29 user30 user31 user32 user33 user34 user35 user36 user37 user38 user39 user40 user41 user42 user43 user44 user45 user46 user47 user48 user49 user50
Do Something with user51 user52 user53 user54 user55 user56 user57 user58 user59 user60 user61 user62 user63 user64 user65 user66 user67 user68 user69 user70 user71 user72 user73 user74 user75 user76 user77 user78 user79 user80 user81 user82 user83 user84 user85 user86 user87 user88 user89 user90 user91 user92 user93 user94 user95 user96 user97 user98 user99 user100

while루프 내에서 원하는 것은 무엇이든 할 수 있습니다

답변2

에 이미 목록이 있으므로 $@또 다른 접근 방식은 목록을 반복하고 50 배치 표시에서 절전 모드로 전환하는 것입니다.

#!/bin/bash
channel=$1
shift

index=0
while [ "$#" -gt 0 ]
do
  (( ++index ))
  curl # ... --data ... "user":"'"$1"'"
  (( index % 50 == 0 )) && sleep 60
  shift
done

curl내가 제안하는 내용의 구조를 더 쉽게 볼 수 있도록 대부분의 명령을 생략했습니다 . 첫 번째 변경 사항은 채널 이름을 자체 변수에 넣고 매개변수를 방해가 되지 않는 위치로 옮기는 것입니다. 그런 다음 나머지 요소는 $@사용자 이름입니다.

다음 부분은 while요소가 있는 한 실행되는 간단한 루프 입니다 $@. 루프를 통과할 때마다 우리는 다음을 수행합니다.

  • 카운터를 증가시키다
  • curl항소$1
  • sleep만약 우리가 해야 한다면
  • shift첫 번째 요소를 그대로 둡니다.$@

관련 정보