この問題は、圧縮されたアーカイブでのみ発生します。最初に圧縮されていないアーカイブを作成して使用し、後でループが実行されたときに圧縮することを提案します。
tar cf my_app.tar --files-from /dev/null
for app_item in "${app_items[@]}"
do
tar rf my_app.tar "$app_item"
done
gzip my_app.tar
@Matthias がコメントで指摘したように、空のアーカイブ (最初の行で必要なもの) の作成は通常、によって拒否されtar
ます。これを強制するには、オペレーティング システムごとに異なるトリックが必要です。
- BSD :
tar cf empty.tar --from-file /dev/null
- GNU (リナックス) :
tar cvf empty.tar --files-from /dev/null
- ソラリス:
tar cvf empty.tar -I /dev/null
これについての詳細は、彼がリンクしたページを説明しています。
スペースを含むファイル名でもうまく機能するように見える完全に異なるアプローチ(ただし、改行を含むファイル名では機能しないため、それほど一般的ではありません):
tar cfz my_app.tgz --files-from <(printf "%s\n" "${app_items[@]}")
そして、これを行うさらに別の方法(ファイル名の改行やその他のものでも機能します):
eval tar cfz my_app.tgz $(printf "%q " "${app_items[@]}")
ただし、いつものように、eval
何を渡すかを知っておく必要があり、これが信頼できないソースからのものではないことを知っておく必要があります。そうしないと、セキュリティ上の問題が発生する可能性があるため、一般的には避けることをお勧めします。