curlでファイルダウンロード時に文字化けする問題の解決法
問題点
curlコマンドで特定のURLからCSVファイルをダウンロードしようとすると、以下の問題が発生します:
bash
curl --output /home/../test2.csv https://cloudstor.aarnet.edu.au/plus/s/2DhnLGDdEECo4ys/download?path=%2FUNSW-NB15%20-%20CSV%20Files&files=UNSW-NB15_1.csv
ダウンロードしたファイルは:
- Excelで正常に開けない
- 文字化けした不可読な状態になる
- ブラウザから直接ダウンロードした場合には正常に動作する
重要な注意点
この問題の根本原因はダウンロードURLに含まれる &
(アンパサンド) 文字です。シェルがこの文字を特殊記号として解釈するため、URLが途中で切断されます。
効果的な解決策
(1) URLを引用符で囲む(推奨)
最も簡単で確実な方法は、URL全体をダブルクォーテーションで囲むことです:
bash
curl --output test.csv "https://cloudstor.aarnet.edu.au/plus/s/2DhnLGDdEECo4ys/download?path=%2FUNSW-NB15%20-%20CSV%20Files&files=UNSW-NB15_1.csv"
技術的な理由
&
はシェルにおいて「コマンドをバックグラウンドで実行」する記号です- 引用符で囲むことで、シェルがその後の文字をコマンドとして解釈するのを防ぎます
- URL全体を一つの文字列としてcurlに正しく渡せます
(2) URLエスケープを使用する(代替案)
引用符を使用できない場合、&
を \&
でエスケープする方法もあります:
bash
curl --output test.csv https://cloudstor.aarnet.edu.au/plus/s/2DhnLGDdEECo4ys/download?path=%2FUNSW-NB15%20-%20CSV%20Files\&files=UNSW-NB15_1.csv
補足説明
正しいダウンロードの確認
ダウンロード後、ファイルが正しく取得できたか確認するには:
bash
file test.csv # ファイルタイプの確認
head test.csv # 先頭部分のプレビュー
よくあるエラーケース
- URLを引用符で囲まない場合、シェルは
&
でコマンドが終了したと判断 - 実際には以下の部分だけがcurlに渡される:bash
https://cloudstor.aarnet.edu.au/plus/s/2DhnLGDdEECo4ys/download?path=%2FUNSW-NB15%20-%20CSV%20Files
- サーバーが不完全なリクエストを受け取り、正しくないファイルを返却
応用: 複数ファイルの一括ダウンロード
同様の原理で、複数のファイルをダウンロードする場合:
bash
curl -O "https://example.com/file1?param=value&name=file1.csv" \
-O "https://example.com/file2?param=value&name=file2.csv"
一般的なベストプラクティス
常にURLは引用符で囲む ことを習慣化しましょう。URLに問題となる文字が含まれていない場合でも、この習慣は安全なコマンド実行に役立ちます:
- スペースを含むURLで必須
?
,&
,=
などの特殊文字を含むURLで特に重要
引用符でURLを囲むことで、curlは意図した通りのリソースにアクセスすることができ、正しいファイルをダウンロードできるようになります。これにより、ファイルの文字化け問題やExcelでの表示問題は完全に解決されます。