Я работаю над сценарием, который будет перебирать текстовый файл, настроенный как таковой:
snap-foo bar 20170202
Этот текстовый файл в основном имеет идентификаторы снимков, тег, который мы используем для идентификации экземпляров связанный, и отметка времени, когда снимки были созданы в 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
Может ли кто-нибудь сказать мне, как правильно это сделать?
Вы не перебираете содержимое файла, а обрабатываете все его содержимое за один раз; в частности, SNAP_ID
в итоге содержит весь первый столбец, что, очевидно, слишком много для использования в одной команде.
Вам нужно обрабатывать файл построчно, используя что-то вроде
< "$FILE" while read SNAP_ID _ TIMESTAMP_SNAPS; do
if ...
done
Существует ряд предостережений при использовании read
, связанных с влиянием читаемого содержимого (специальные символы, обратные слеши и т.д.), о которых вам, вероятно, стоит прочитать, если вы хотите применить эту технику более широко. Оболочка на самом деле не является хорошим инструментом для обработки файлов...