私は次のように設定されたテキストファイルを繰り返すスクリプトを書いています。
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
含まれます。これは単一のコマンドとして使用するには多すぎます。
次のようなものを使用してファイルを1行ずつ処理する必要があります。
< "$FILE" while read SNAP_ID _ TIMESTAMP_SNAPS; do
if ...
done
read
この手法をより広範囲に適用する場合は、読書内容(特殊文字、バックスラッシュなど)の影響に関するさまざまな注意事項をお読みください。シェルはそれほど良いファイル処理ツールではありません。