저는 다음과 같이 설정된 텍스트 파일을 반복하는 스크립트를 작성하고 있습니다.
snap-foo bar 20170202
이 텍스트 파일에는 주로 스냅샷 ID, 연결된 인스턴스를 식별하는 데 사용하는 태그, AWS에서 스냅샷이 생성된 타임스탬프가 포함되어 있습니다. 스크립트를 거의 완료했지만 마지막 부분을 작업하는 동안 계속 오류가 발생합니다.
#!/bin/bash
THIRTY_DAYS_AGO=$(date --date '30 days ago' "+%Y%m%d")
FILE=/home/rkahil/sorted_snaps.txt
for a in $FILE
do
SNAP_ID=`awk {'print $1'} "$FILE"`
FORMAT_FILE=`sed -i 's/T.*//' "$FILE"`
TIMESTAMP_SNAPS=`cat "$FILE" | awk {'print $3'}`
if [[ "$FORMATTED_DATE" -lt "$THIRTY_DAYS_AGO" ]];
then
aws ec2 delete-snapshot --dry-run "$SNAP_ID" #Where the error is
fi
done
내가 얻는 오류는 다음과 같습니다.
./removeOldSnapShots.sh: line 13: /usr/bin/aws: Argument list too long
누군가 이 작업을 수행하는 올바른 방법이 무엇인지 말해 줄 수 있습니까?
답변1
파일 내용을 반복하는 대신 모든 내용을 한 번에 처리하므로 특히 SNAP_ID
첫 번째 열을 모두 포함하게 되는데, 이는 단일 명령으로 사용하기에는 너무 많습니다.
다음과 같은 것을 사용하여 파일을 한 줄씩 처리해야 합니다.
< "$FILE" while read SNAP_ID _ TIMESTAMP_SNAPS; do
if ...
done
read
이 기술을 더 광범위하게 적용하려는 경우 읽는 내용(특수 문자, 백슬래시 등)의 영향과 관련된 여러 가지 주의 사항을 읽어 볼 수 있습니다 . 쉘은 그다지 좋은 파일 처리 도구는 아닙니다.