Le problème existe uniquement avec les archives compressées. Je propose de créer et d'utiliser d'abord une archive non compressée et de la compresser plus tard lorsque la boucle a été exécutée.
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
Comme @Matthias a souligné dans un commentaire, ce qui crée une archive vide (ce que nous voulons dans la première ligne) est généralement refusée par tar
. Pour le forcer à le faire, nous avons besoin d'un truc qui diffère du système d'exploitation du système d'exploitation:
- BSD:
tar cf empty.tar --from-file /dev/null
- GNU (Linux):
tar cvf empty.tar --files-from /dev/null
- Solaris:
tar cvf empty.tar -I /dev/null
Plus de détails à ce sujet explique the page he linked to.
Une approche complètement différente qui semble également fonctionner très bien avec des noms de fichiers avec des espaces en eux (mais pas avec des noms de fichiers avec des sauts de ligne en eux, il est donc pas tout à fait général):
tar cfz my_app.tgz --files-from <(printf "%s\n" "${app_items[@]}")
Et encore une autre façon de le faire (qui travaille aussi avec des sauts de ligne et d'autres choses dans les noms de fichiers:
eval tar cfz my_app.tgz $(printf "%q " "${app_items[@]}")
Mais comme d'habitude avec eval
vous devez savoir ce que vous passez à lui et que rien de cela provient d'une source non fiable, sinon cela pourrait poser un problème ty question, donc en général, je recommande de l'éviter.
Qu'en est-il de boucler en ajoutant le 'app_item' à une variable et finalement en faisant tar $ that_variable'? – fedorqui
Quelle erreur obtenez-vous? –
Merci @fedorqui, votre solution de contournement fait l'affaire! – alexs333