Проблема существует только со сжатыми архивами. Я предлагаю сначала создать и использовать несжатый архив и сжать его позже, когда цикл прошел.
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 (Linux):
tar cvf empty.tar --files-from /dev/null
- Solaris:
tar cvf empty.tar -I /dev/null
Подробнее об этом объясните the page he linked to.
Совершенно иной подход, который также, кажется, хорошо работать с именами файлов с пробелами в них (но не с именами файлов с символами новой строки в них, так что это не совсем так вообще):
tar cfz my_app.tgz --files-from <(printf "%s\n" "${app_items[@]}")
И еще другой способ сделать это (который также работает с символами новой строки и другими вещами в именах файлов:
eval tar cfz my_app.tgz $(printf "%q " "${app_items[@]}")
Но, как обычно, с eval
вы должны знать, что вы передадите ему, и что ничего из этого не происходит из ненадежного источника, в противном случае он может представлять собой securi так что в целом я рекомендую избегать этого.
Как насчет того, чтобы циклическое добавление 'app_item' к переменной и, наконец, выполнение' tar $ that_variable'? – fedorqui
Какая ошибка вы получаете? –
Спасибо @fedorqui, ваше обходное решение делает трюк! – alexs333