はじめに
SIGNATE CLIを更新(ver0.10.4)したら、ファイルのダウンロードがひとつひとつ指定しなければできなくなっていました(自分がやり方知らないだけかもしれませんが)。
昔は一括でできたのに、なぜこんな改悪をしたのかわかりませんが、AIに壁打ちしてまとめてダウンロードするシェルスクリプトを書いてもらったので公開します。
スクリプト
スクリプトのファイル名は「download_signate.sh」とします。
なお、実施環境はUbuntuです。bashで実行してください。
不要な行とかもありますが、消すのも面倒だったのでそのまま掲載します。
#!/bin/bash
if [ -z "$1" ]; then
echo "⚠️ ERROR: COMPETITION_KEYが指定されていません。"
echo "Usage: bash $0 <COMPETITION_KEY>"
exit 1
fi
# 最初の引数を COMPETITION_KEY に設定
COMPETITION_KEY="$1"
echo "== 🔍 Running signate task-list... =="
signate task-list --competition_key="$COMPETITION_KEY"
mapfile -t PUBLIC_KEYS < <(signate task-list --competition_key="$COMPETITION_KEY" | grep -v 'public_key' | grep -v '-' | awk 'NR=1 {print $1;}')
# 抽出結果の表示
if [ "$PUBLIC_KEYS" -eq 0 ]; then
echo "== ⚠️ ERROR: public_key could not be found or extracted. =="
exit 1
fi
ALL_FILE_PUBLIC_KEYS=()
ALL_FILE_NAMES=()
for TASK_KEY in "${PUBLIC_KEYS[@]}"; do
echo "== 📥 Downloading task with public_key: $KEY =="
for TASK_KEY in "${PUBLIC_KEYS[@]}"; do
echo "--- Getting file list for Task Key: $TASK_KEY ---"
# 2. signate file-list コマンドを実行し、結果からキーとファイル名を抽出
while read -r LINE; do
# 'awk'でスペース区切りの最初のフィールド($1=ファイルキー)と2番目のフィールド($2=ファイル名)を取得
FILE_KEY=$(echo "$LINE" | awk '{print $1}')
FILE_NAME=$(echo "$LINE" | awk '{print $2}')
# 抽出されたキーとファイル名が空でないことを確認して配列に追加
if [[ -n "$FILE_KEY" && -n "$FILE_NAME" ]]; then
echo " Found and downloading: $FILE_NAME (Key: $FILE_KEY)"
signate download --task_key="$TASK_KEY" --file_key="$FILE_KEY"
if [ $? -ne 0 ]; then
# エラーが発生しても処理は継続します
echo " ⚠️ ERROR: Failed to download $FILE_NAME (Key: $FILE_KEY). Continuing..."
fi
fi
done < <( \
signate file-list --task_key="$TASK_KEY" | \
grep -v 'public_key' | \
grep -v '-' \
)
done
done
実行方法
SIGNATE CLIがインストールされていなければインストールしてください。signateへのアカウント登録などもする必要がありますが、ここでは省略します。
pip install signate
コンペのpublic_keyを確認します
signate competition-list
ダウンロードしたいpublic_keyを保存し、次のようにスクリプトを実行してください。
bash download_signate_file.sh <コンペのpublic_key>
終わりに
こんなスクリプトを使わないくてもいいように、公式の方でまとめてダウンロードできるようにしてほしいです。
